supermapper

1.5.0 • Public • Published

supermap

invocation

mappedData = supermap(dataToMap, keyMapping, opts);

//compile your mapping for much faster runtime

compiledMap = supermap.compile(keyMapping, opts);

mappedData = compiledMap(dataToMap, opts);

basic usage

const supermap = require('supermapper');

var dataToMap = {
	name: "greg",
	job: {
		type: "programmer",
		responsibilities: ["write code", "conference calls"]
	}
}

var keyMapping = {
	"name": "employee.person.name",
	"job.type": "employee.job.title",
	"job.responsibilities[0]": "employee.job.skills[0]",
	"job.responsibilities[1]": "employee.job.skills[1]",
}

supermap(dataToMap, keyMapping);

//result
// {
//     "employee": {
//         "person": {
//             "name": "greg"
//         },
//         "job": {
//             "title": "programmer",
//             "skills": [
//                 "write code",
//                 "conference calls"
//             ]
//         }
//     }
// }

altering values with the compose function

var dataToMap = {
	name: "greg",
	job: {
		type: "programmer",
		tier: "band 8"
	},

}

var keyMapping = {
	"name": "employee.person.name",
	"job.type": {
		key: "employee.job",
		compose: (pointer, value, data) => {
			return `${data.job.tier} ${value}`
		}
	},
}

supermap(dataToMap, keyMapping);

//result
// {
//     "employee": {
//         "person": {
//             "name": "greg"
//         },
//         "job": "band 8 programmer"
//     }
// }

using an overriding callback at runtime

var dataToMap = {
	name: "greg",
	job: {
		type: "programmer"
	}
}

var keyMapping = {
	"name": "employee.person.name",
	"job.type": "employee.job",
}

supermap(dataToMap, keyMapping, {
	callback: (source, dest, value) => {
		return `${value}, awesome`
	}
});

//result
// {
//     "employee": {
//         "person": {
//             "name": "greg, awesome"
//         },
//         "job": "programmer, awesome"
//     }
// }

creating a value map object to quickly compose strings from an enumerated list

var dataToMap = {
	name: "greg",
	job: {
		type: "programmer"
	}
}

var keyMapping = {
	"name": "employee.person.name",
	"job.type": {
		key: "employee.job",
		valueMap: {
			"programmer": "Engineer",
			"_": "Unemployed" //Default Value if not found in map
		}
	}
}

supermap(dataToMap, keyMapping);

//result
// {
//     "employee": {
//         "person": {
//             "name": "greg"
//         },
//         "job": "Engineer"
//     }
// }

creating a value map array to quickly compose any data from an enumerated list

var dataToMap = {
	name: "greg",
	job: {
		type: "programmer"
	}
}

var keyMapping = {
	"name": "employee.person.name",
	"job": {
		key: "employee.job",
		valueMap: [
			[{"type": "programmer"}, {"role": "Engineer"}],
			["_", {"role": "Something Else"}], //Default Value if not found in array
		]
	}
}

supermap(dataToMap, keyMapping);

// {
//     "employee": {
//         "person": {
//             "name": "greg"
//         },
//         "job": {
//             "role": "Engineer"
//         }
//     }
// }

setting a default value if incoming data is null or undefined for the key

var dataToMap = {
	name: "greg"
}

var keyMapping = {
	"name": "person.name",
	"height": {
		key: "person.height",
		default: "N/A"
	}
}

supermap(dataToMap, keyMapping);

//result
// {
//     "person": {
//         "name": "greg",
//         "height": "N/A"
//     }
// }

copying computed value to additional keys

var dataToMap = {
	name: "greg"
}

var keyMapping = {
	"name": {
		key: "person.name",
		compose: (_, val) => {
			return val.replace(/^\w/, c => c.toUpperCase()) //capitalize first name
		},
		additional: [
			"person.firstName",
			"person.givenName"
		]
	},
}
supermap(dataToMap, keyMapping);

//result
// {
//     "person": {
//         "name": "Greg",
//         "firstName": "Greg",
//         "givenName": "Greg"
//     }
// }

value interpolation

enclose the json pointer in {brackets} to interpolate the value of the incoming data and use as a key.

var dataToMap = {
	job: {
		type: "programmer",
		responsibilities: ["write code", "conference calls"]
	}
}

var keyMapping = {
	"job.responsibilities": "{job.type}.skills"
}

supermap(dataToMap, keyMapping);

//result
// {
//     "programmer": {
//         "skills": [
//             "write code",
//             "conference calls"
//         ]
//     }
// }

map each in an array

the each parameter will iterate over objects in an array and map them

let dataToMap = {
	company: {
		resources: [
			{
				firstName: "Greg",
				role: "Programmer"
			},
			{
				firstName: "Adam",
				role: "Admin"
			}
		]
	}
}

let keyMapping = {
	"company.resources" : {
		key: "people.employees",
		each: {
			map: {
				firstName: "name",
				role: "job"
			}
		}
	}
}

supermap(dataToMap, keyMapping);

// result
// {
//     "people": {
//         "employees": [
//             {
//                 "name": "Greg",
//                 "job": "Programmer"
//             },
//             {
//                 "name": "Adam",
//                 "job": "Admin"
//             }
//         ]
//     }
// }

push to array

passing a number says to treat the target like an array. passing a + symbol is like passing a number, but it will append to the array.

var dataToMap = {
	people: {
		job1: "designer",
		job2: "programmer",
		job3: "admin"
	}
}

var keyMapping = {
	"people.job1": "positions[0].job",
	"people.job2": "positions[1].job",
	"people.job3": "positions[+].job"
}

supermap(dataToMap, keyMapping);

//result
// {
//     "positions": [
//         {
//             "job": "designer"
//         },
//         {
//             "job": "programmer"
//         },
//         {
//             "job": "admin"
//         }
//     ]
// }

runtime opts

{
	writeNull: true | false // (default: false) if the incoming data value is null or undefined, create the key in mapped object 
	base: Object // rather than creating a new object for the map, pass a mutable object to be altered
}

compile opts

{
	flip: true | false // (default: false) flip the direction of keys and values in mapping
}

Readme

Keywords

none

Package Sidebar

Install

npm i supermapper

Weekly Downloads

5

Version

1.5.0

License

ISC

Unpacked Size

26.5 kB

Total Files

15

Last publish

Collaborators

  • scoin