Search code examples
javascriptdata-structurestreebinary-treerecursive-datastructures

Transform data structure to tree data in JavaScript


I have a data structure like this:

 data = [
    {
      parent: {name: 'Sheet'},
      firstArray: [{sampleVar: 0.3, typeName: 'active'}, {sampleVar: 0.4, typeName: 'active'}],
      secondArray: [{sampleVar: 1.2, typeName: 'passive'}, {sampleVar: 1.3 , typeName: 'passive'}]
    },...
  ]

I want to transform it to a tree data like this:

  treeData = [
    {
      parent: {
        name: 'Sheet',
        children: [{
          typeName: 'active',
          children: [
            {sampleVar: 0.3},
            {sampleVar: 0.4}
          ]
        },
          {
            typeName: 'passive',
            children: [
              {sampleVar: 1.2},
              {sampleVar: 1.3}
            ]
          },...
        ]
      },...
    }
  ];

I have to mention that my variable typeName has the same value for each array. Does anyone know a good approach to achieve this?


Solution

  • You can use Object.values and map to get the result. I've used an example input that varies a bit more:

    const data = [{
      parent: {name: 'SheetA'},
      justOne: [{sampleVar: 0.3, typeName: 'active'}],
      hasTwo: [{indicator: 1.2, typeName: 'passive'}, {indicator: 1.3 , typeName: 'passive'}]
    }, {
      parent: {name: 'SheetB'},
      hasThree: [{otherVar: 9.3, typeName: 'selected'}, {otherVar: 9.4, typeName: 'selected'}, {otherVar: 9.5, typeName: 'selected'}],
      secondArray: [{message: 7.2, typeName: 'locked'}, {message: 7.3 , typeName: 'locked'}]
    }];
    
    const treeData = data.map(({parent, ...rest}) => ({
        ...parent,
        children: Object.values(rest).map(arr => ({
            typeName: arr[0]?.typeName,
            children: arr.map(({typeName, ...rest}) => rest)
        }))
    }));
    
    console.log(treeData);