Skip to content Skip to sidebar Skip to footer

Better Way To Map A Deep Object To New Object

This code works for converting the JSON to an object where each name object turns into the key for either its value, or if it instead has its own element object breaks that out and

Solution 1:

You could destructure the object, get name, ele and value and return a new object with name as key and either an array by mapping the objects of ele or the value.

const
    getData = ({ name, ele, value }) => ({
        [name]: Array.isArray(ele)
            ? ele.map(getData)
            : value
    });

var scheme = JSON.parse('{"$schema":{"root":{"name":"THINGY","dtd":{"name":"DOCTYPE","value":"something.dtd","commentBefore":["?xml version=\'1.0\'?","Version NULL"]},"ele":{"name":"REPORT","ele":[{"name":"SEGMENT0","ele":[{"name":"NUMBER1","value":""},{"name":"NUMBER2","value":""}]},{"name":"SEGMENT1","ele":[{"name":"RECORD1","ele":[{"name":"NUMBER1","value":""},{"name":"NUMBER2","value":""}]}]},{"name":"SEGMENT2","ele":[]},{"name":"SEGMENT3","ele":[]},{"name":"SEGMENT4","ele":[]},{"name":"SEGMENT5","ele":[]}]}}}}').$schema.root,
    result = getData(scheme.ele);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Solution 2:

Nina's answer is cleaner but this looks a bit more like your code so I figured I'd post it anyway.

let scheme = JSON.parse('{"$schema":{"root":{"name":"THINGY","dtd":{"name":"DOCTYPE","value":"something.dtd","commentBefore":["?xml version=\'1.0 \'?","Version NULL"]},"ele":{"name":"REPORT","ele":[{"name":"SEGMENT0","ele":[{"name":"NUMBER1","value":""},{"name":"NUMBER2","value":"1"}]},{"name":"SEGMENT1","ele":[{"name":"RECORD1","ele":[{"name":"NUMBER1","value":"2"},{"name":"NUMBER2","value":""}]}]},{"name":"SEGMENT2","ele":[]},{"name":"SEGMENT3","ele":[]},{"name":"SEGMENT4","ele":[]},{"name":"SEGMENT5","ele":[]}]}}}}').$schema.root;
let newScheme = JSON.parse('{"$schema":{"root":{"name":"THINGY","dtd":{"name":"DOCTYPE","value":"something.dtd","commentBefore":["?xml version=\'1.0 \'?","Version NULL"]},"ele":{"name":"REPORT","ele":[{"name":"SEGMENT0","ele":[{"name":"NUMBER1","value":"1"},{"name":"NUMBER2","value":"3"}]},{"name":"SEGMENT1","ele":[{"name":"RECORD1","ele":[{"name":"NUMBER1","value":"4"},{"name":"NUMBER2","value":""}]}]},{"name":"SEGMENT2","ele":[]},{"name":"SEGMENT3","ele":[]},{"name":"SEGMENT4","ele":[]},{"name":"SEGMENT5","ele":[]}]}}}}').$schema.root;

//Yay, recursion!
function mapObj(a, o = {}) {

  let array = o[a.name] || [];

  for (let i = 0; i < a.ele.length; i++) {

    let b = a.ele[i];
    array[i] = b.ele ?
      mapObj(b, array[i]) : {
        [b.name]: b.value
      };
  }
  
  o[a.name] = array;
  return o;

}

let obj = mapObj(scheme.ele);

console.log(obj);
console.log(mapObj(newScheme.ele, obj));

Post a Comment for "Better Way To Map A Deep Object To New Object"