Tengo una estructura de datos como esta:
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'}] },... ]Quiero transformarlo en un árbol de datos como este:
treeData = [ { parent: { name: 'Sheet', children: [{ typeName: 'active', children: [ {sampleVar: 0.3}, {sampleVar: 0.4} ] }, { typeName: 'passive', children: [ {sampleVar: 1.2}, {sampleVar: 1.3} ] },... ] },... } ]; Debo mencionar que mi variable typeName tiene el mismo valor para cada matriz. ¿Alguien sabe un buen enfoque para lograr esto?
Puede usar Object.values y map para obtener el resultado. He usado una entrada de ejemplo que varía un poco más:
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);Teniendo en cuenta que cada matriz tiene 2 elementos, solo cada matriz tiene su propio nombre de tipo, esto funciona.
var result = [ { parent: { name: data[0].parent.name, children: [] } } ]; for (const property in data[0]) { if (property == "parent") continue; let array = data[0][property]; result[0].parent.children.push({ typeName: array[0].typeName, children: [ { sampleVar: array[0].sampleVar }, { sampleVar: array[1].sampleVar } ] }); } console.log(result);