Tengo una matriz como:
const arr=[{ id: 9, name: 'Patrimônios', children: [], }, { id: 10, name: 'Despesas', children: [ { id: 16, name: 'Manutenção' }, { id: 17, name: 'Despesa' }, { id: 18, name: 'Impostos' }, { id: 19, name: 'Gráfica' }, ], }, ....]
Me gustaría una función para eliminar un artículo por id. Como podemos ver el ítem puede estar en 'niños' o no. Si el elemento está en los "hijos", me gustaría eliminarlo solo de la matriz de niños.
Me gustaría algo como:
findById(tree, nodeId) { for (const node of tree) { if (node.id === nodeId) return node if (node.children && node.children.length) { const desiredNode = this.findById(node.children, nodeId) if (desiredNode) return desiredNode } } return false }, function deleteItemById(arr,id){ item=findById(arr,id) if (item){ /// here How I can delete it? } }
¿Cómo podría hacer eso?
Aquí hay una función recursiva que coincide con la terminología de su código para filtrar un objeto por id:
const removeObjectByIdRecursively = (list, id) => list.reduce((acc, item) => { if (item.id === id) return acc; if (item.children) { return [ ...acc, { ...item, children: removeObjectByIdRecursively(item.children, id) } ]; } return [ ...acc, item ]; }, []);
Súper básico, no probado y dirigido directamente a la forma de sus datos, pero esto muestra cómo puede usar Array.filter() para devolver una nueva matriz que no contiene los elementos que desea eliminar por id.
const testArray = [ { id: 0, value: "zero" }, { id: 1, value: "one", children: [{ id: 3 }] }, { id: 2, value: "two" }, { id: 3, value: "three" }, { id: 4, value: "four" }, ]; const deleteObjectById = ({ ary, id }) => ary.filter((item) => { const child = (item.children || []).find((c) => c.id === id); return item.id !== id && !(!!child); }); const filteredArray = deleteObjectById({ ary: testArray, id: 3, }); console.log(testArray); console.log(filteredArray);