Digamos que tengo una matriz de objetos anidados como:
const data = [ { id: 1, children:[ { id: 2, children:[ { id: 3, children:[ { id: 4, children: [], }, { id: 5, children: [], } ], }, ], }, ], }, { id: 8, children:[ { id: 9, children:[ { id: 10, children:[], }, ], }, ], }, ];Y me gustaría devolver una nueva matriz con id: 3 excluidos, por ejemplo. Entonces se convertiría en:
const data = [ { id: 1, children:[ { id: 2, children:[], }, ], }, { id: 8, children:[ { id: 9, children:[ { id: 10, children:[], }, ], }, ], }, ];El ID excluido puede ser de cualquier nivel, y tanto él como sus elementos secundarios deben eliminarse. ¿Cuál es el mejor enfoque para hacer esto? He intentado varias otras soluciones sin suerte hasta ahora.
Puedes usar recursividad y Array.reduce ,..
p.ej.
const data=[{id:1,children:[{id:2,children:[{id:3,children:[{id:4,children:[]},{id:5,children:[]}]},]},]},{id:8,children:[{id:9,children:[{id:10,children:[]},]},]},] function removeId(data, id) { return data.reduce((a,v) => { if (v.id !== id) a.push({...v, children: removeId(v.children, id)}); return a; }, []); } const r = removeId(data, 3); console.log(r);Puede usar una combinación de JSON.parse y JSON.stringify para llegar a cada nodo del objeto:
JSON.parse(JSON.stringify(data, (key, value) => { // If children is an array and it contains an id equal to 3, we filter out that child if (key === 'children' && value instanceof Array) return value.filter(x=>x.id!==3); // Otherwise we don't intervene return value; }));Ejemplo:
const data = [ { id: 1, children:[ { id: 2, children:[ { id: 3, children:[ { id: 4, children: [], }, { id: 5, children: [], } ], }, ], }, ], }, { id: 8, children:[ { id: 9, children:[ { id: 10, children:[], }, ], }, ], }, ]; console.log(JSON.parse(JSON.stringify(data, (key, value) => { if (key === 'children' && value instanceof Array) return value.filter(x=>x.id!==3); return value; })));Dado que los navegadores implementan de forma nativa los dos métodos JSON, esta solución suele ser más rápida