简体   繁体   中英

Transform nested JS object AST to another using mapping

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:

  • provided example is Traverser
  • it has options support from the box
  • would be better to switch places of from 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM