I want to transform a nested JS object in AST structure into another using mappings, It can be any level deep. Any help is deeply appreciated. We can use lodash as well if that is convenient.
Motivation:- Supply data can be in several formats, I need to create standard products using different supply objects, for which we can create standard product model and several mappings for product model to supply.
If you think this problem can be solved with a better data modeling of product model or map model, I 'll highly appreciate the suggestions. The supply model is fixed nonetheless.
Data
const source = {
a:1,
b:2,
c:7,
children:[
{
a:3,
b:7,
d:8,
children: [
{
a:6,
b:8,
x:4
}
]
},
{
a:5,
b:3,
c:9
}
]
}
Mappings
const map = {
c:'a',
d:'b',
elements: {
identifier:'children', // which field to lookout for children
ofType: 'map' // every child has similar structure as parent
}
}
Here is the output i am expecting
const output = {
c:1,
d:2,
elements:[
{
c:3,
d:7,
elements:[
{
c:6,
d:8
}
]
},
{
c:5,
d:3
}
]
}
Here is how it could be solved using tool I'm working on Putout :
const defaultMap = {
a: 'c',
b: 'd',
children: 'elements',
}
export const fix = (path, {options}) => {
const map = options.map || defaultMap;
const {name} = path.node.key;
path.node.key.name = defaultMap[name];
};
export const traverse = ({push, options}) => ({
'ObjectProperty': (path) => {
const map = options.map || defaultMap;
const {key} = path.node;
if (map[key.name])
push(path);
}
});
Check out in Putout Editor .
What it does is searches for ObjectProperties
and then does the of renaming.
Notes:
options
support from the boxfrom
and to
in defaultMap
it simplifies things a lot;)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.