Considere que tengo una matriz como esta
const ar = [ {id: 1, name: "A", parent: null}, {id: 2, name: "B", parent: 1}, {id: 11, name: "AA", parent: 1}, {id: 12, name: "AB", parent: 1}, {id: 111, name: "AAA", parent: 11}, {id: 41, name: "CC", parent: 4}, {id: 4, name: "C", parent: 1}, ];¿Cómo creo una jerarquía de un solo objeto como este?
{ id: 1, name: "A", parent: null, children: [ { id: 11, name: "AA", parent: 1, children: [ {id: 111, name: "AAA", parent: 11}], }, {id: 2, name: "B", parent: 1, children: []}, { id: 4, name: "C", parent: 1, children: [{id: 41, name: "CC", parent: 4, children: []}], }, ], } La id en realidad no es un número en mi aplicación real. Es una cadena aleatoria por cierto.
Podría hacerlo de forma recursiva explorando la matriz de children , pero no es la forma más efectiva. ¿Alguien puede ayudar por favor?
const ar = [ {id: 1, name: "A", parent: null}, {id: 2, name: "B", parent: 1}, {id: 11, name: "AA", parent: 1}, {id: 12, name: "AB", parent: 1}, {id: 111, name: "AAA", parent: 11}, {id: 41, name: "CC", parent: 4}, {id: 4, name: "C", parent: 1}, ]; const hierarchy = (arr) => { const map = {}; let root; for (const ele of arr) { map[ele.id] = ele; ele.children = []; } for (const ele of arr) { if (map[ele.parent] != undefined) map[ele.parent].children.push(ele); else root = ele; } return root; } console.log(hierarchy(ar));Puede iterar a través de la matriz y empujar el elemento al lugar correcto cada vez.
Para obtener la raíz, puede recuperar el elemento sin padre.
const arr = [{id: 1, name: "A", parent: null}, {id: 2, name: "B", parent: 1}, {id: 11, name: "AA", parent: 1}, {id: 12, name: "AB", parent: 1}, {id: 111, name: "AAA", parent: 11}, {id: 41, name: "CC", parent: 4}, {id: 4, name: "C", parent: 1}] arr.forEach(elem => elem.children = []) arr.forEach(elem => { if(elem.parent){ const parent = arr.find(x => x.id === elem.parent) if(parent)parent.children.push(elem) } }) console.log(arr.find(x => !x.parent)) Nota : si desea optimizar un poco más, puede agregar la matriz de niños en el segundo forEach
El primer paso es mapear los elementos por ID para que tenga una búsqueda fácil y no esté recorriendo la matriz varias veces. Después de eso, solo necesita recorrer y agregar una matriz de niños al padre y agregar la referencia.
const ar = [ {id: 1, name: "A", parent: null}, {id: 2, name: "B", parent: 1}, {id: 11, name: "AA", parent: 1}, {id: 12, name: "AB", parent: 1}, {id: 111, name: "AAA", parent: 11}, {id: 41, name: "CC", parent: 4}, {id: 4, name: "C", parent: 1}, ]; // make a look up by the id const mapped = ar.reduce((acc, item) => { acc[item.id] = item; return acc; }, {}); // loop over const result = ar.reduce((acc, item) => { // if there there is no parent, we know it is the first so return it const parentId = item.parent; if (!parentId) return item; // if we have a parent, see if we found this yet, if not add the array mapped[parentId].children = mapped[parentId].children || []; // set the item as a child mapped[parentId].children.push(item); return acc; }, null); console.log(result)