Aquí está la matriz Json, cada objeto tiene propiedades is_parent y parent_id, si un objeto tiene objetos secundarios, entonces su propiedad is_parent es 1 y viceversa.
let list = [ {id: 4, name: 'dd', is_parent: 1, parent_id: 0}, /**/{id: 5, name: 'ee', is_parent: 0, parent_id: 4}, /**/{id: 6, name: 'ff', is_parent: 1, parent_id: 5}, /**//**/{id: 7, name: 'gg', is_parent: 0, parent_id: 6}, {id: 8, name: 'hh', is_parent: 1, parent_id: 0}, /**/{id: 9, name: 'ii', is_parent: 0, parent_id: 8}, {id: 10, name: 'jj', is_parent: 1, parent_id: 0}, /**/{id: 11, name: 'kk', is_parent: 1, parent_id: 10}, /**//**/{id: 12, name: 'll', is_parent: 1, parent_id: 11}, /**//**//**/{id: 13, name: 'mm', is_parent: 0, parent_id: 12}, ],Quiero formatear por encima de la matriz json como se muestra a continuación
let array = [ { id: 4, name: 'dd', is_parent: 1, parent_id: 0, children: [ {id: 5, name: 'ee', is_parent: 0, parent_id: 4}, { id: 6, name: 'ff', is_parent: 1, parent_id: 5, children: [ {id: 7, name: 'gg', is_parent: 0, parent_id: 6} ] } ] }, { id: 8, name: 'hh', is_parent: 1, parent_id: 0, children: [ {id: 9, name: 'ii', is_parent: 0, parent_id: 8} ] }, { id: 10, name: 'jj', is_parent: 1, parent_id: 0, children: [ { id: 11, name: 'kk', is_parent: 1, parent_id: 10, children: [ { id: 12, name: 'll', is_parent: 1, parent_id: 11, children: [ {id: 13, name: 'mm', is_parent: 0, parent_id: 12} ] } ] } ] }, ]Intenté hacer esto mediante un bucle foreach dentro de otro bucle foreach pero no funcionó.
Prueba esto.
let formattedJon = (data, root) => { const t = {}; this.list.forEach(o => ((t[o.parent_id] ??= {}).children ??= []).push(Object.assign(t[o.id] ??= {}, o))); return t[root].children; }, data = {data: []}, result = Object.fromEntries(Object .entries(data) .map(([k, v]) => [k, getTree(v, '0')]) ); console.log(result);encontré la respuesta de Build tree array from flat array en javascript
'use strict'; const createDataTree = dataset => { const hashTable = Object.create(null); dataset.forEach(aData => hashTable[aData.id] = {...aData, children: []}); const dataTree = []; dataset.forEach(aData => { if(aData.parent_id) { hashTable[aData.parent_id].children.push(hashTable[aData.id]); } else { dataTree.push(hashTable[aData.id]); } }); console.log(JSON.stringify(dataTree, null ,4)) return dataTree; }; const list = [ {id: 4, name: 'dd', is_parent: 1, parent_id: 0}, /**/{id: 5, name: 'ee', is_parent: 0, parent_id: 4}, /**/{id: 6, name: 'ff', is_parent: 1, parent_id: 5}, /**//**/{id: 7, name: 'gg', is_parent: 0, parent_id: 6}, {id: 8, name: 'hh', is_parent: 1, parent_id: 0}, /**/{id: 9, name: 'ii', is_parent: 0, parent_id: 8}, {id: 10, name: 'jj', is_parent: 1, parent_id: 0}, /**/{id: 11, name: 'kk', is_parent: 1, parent_id: 10}, /**//**/{id: 12, name: 'll', is_parent: 1, parent_id: 11}, /**//**//**/{id: 13, name: 'mm', is_parent: 0, parent_id: 12}, ]; createDataTree(list);Modifiqué el código y tomé un ejemplo de aquí . Este es realmente un buen ejemplo y funciona de maravilla.