Estoy tratando de filtrar una matriz con objetos anidados como este:
const items = [ { "id": 1, "name": "test1", "subitems": [ { "id": 2, "name": "test2", "subsubitems": [ { "id": 3, "name": "test3", }, { "id": 4, "name": "test4", } ] } ] }, { "id": 10, "name": "test10", "subitems": [ { "id": 20, "name": "test20", "subsubitems": [ { "id": 30, "name": "test30", } ] } ] } ] const filteredResults = items.filter((item) => item.subitems.filter((subitem) => subitem.subsubitems.filter((subsubitem) => subsubitem.name.includes('test3') ) ) ) console.log(filteredResults)Pero no está filtrando correctamente, se está devolviendo la matriz original. En este momento solo intento filtrar a nivel de subsubelementos. En última instancia, quiero devolver una matriz con coincidencias para nombrar en cualquier nivel.
Entonces test2 devolvería una matriz como esta:
[ { "id": 1, "name": "test1", "subitems": [ { "id": 2, "name": "test2", "subsubitems": [ { "id": 3, "name": "test3", }, { "id": 4, "name": "test4", } ] } ] } ] Y test3 devolvería una matriz como esta:
[ { "id": 1, "name": "test1", "subitems": [ { "id": 2, "name": "test2", "subsubitems": [ { "id": 3, "name": "test3", } ] } ] } ] Y la test devolvería todo.
Prueba esto:
const items = [ { id: 1, name: "test1", subitems: [ { id: 2, name: "test2", subsubitems: [ { id: 3, name: "test3", }, { id: 4, name: "test4", }, ], }, ], }, { id: 10, name: "test10", subitems: [ { id: 20, name: "test20", subsubitems: [ { id: 30, name: "test30", }, ], }, ], }, ]; const filterItems = (items, filter) => { const result = []; items.forEach((item) => { if (item.name === filter) { result.push(item); } item.subitems.forEach((subitem) => { if (subitem.name === filter) { result.push(item); } subitem.subsubitems.forEach((subsubitem) => { if (subsubitem.name === filter) { result.push(item); } }); }); }); console.log("filtered", result); }; filterItems(items, "test10");El resultado es:
filtered [ { id: 10, name: 'test10', subitems: [ [Object] ] } ]