Tengo el objeto con la siguiente estructura:
let array = [ { name: 'Name1', items: [ { name: 'Name1.1', items: [ { id: '1', name: 'Name1.1.1' }, { id: '2', name: 'Name1.1.2' }, { id: '3', name: 'Name1.1.3' }, ... ], }, { name: 'Name1.2', items: [ { id: '4', name: 'Name1.2.1' }, { id: '5', name: 'Name1.2.2' }, ], }, ], }, { name: 'Name2', items: [ { name: 'Name2.1', items: [ { id: '6', name: 'Name2.1.1' }, { id: '7', name: 'Name2.1.2' }, ], }, ], }, ];
Quiero obtener la rama sin los elementos hermanos, buscando por id. El resultado deseado es la siguiente estructura por id = '4':
let array = [ { name: 'Name1', items: [ { name: 'Name1.2', items: [ { id: '4', name: 'Name1.2.1' }, ], }, ], } ];
Solo pude encontrar el elemento final del árbol ( { id: '4', name: 'Name1.2.1' }
). Pero no entiendo cómo obtener estructuras intermedias del árbol.
const test = (data, id) => { if (!data || !data.length) return null; for (var j = 0; j < data.length; j++) { var result = data[j].items ? test(data[j].items, id) : data[j].id ? data[j].id === id ? data[j] : undefined : undefined; if (result !== undefined) { return result; } } return undefined; }; test(array, '4');
De hecho, debería adoptar un enfoque recursivo, pero su función actualmente solo puede devolver un valor de id
(una cadena) o null
o undefined
. Nunca devuelve una matriz, pero eso es lo que espera obtener.
Cuando se encuentra una solución como caso base, debe envolver esa solución en una matriz y un objeto simple, cada vez que sale del árbol de recursividad.
Aquí hay una solución de trabajo:
function getPath(forest, targetid) { for (let root of forest) { if (root.id === targetid) return [root]; // base case let items = root.items && getPath(root.items, targetid); if (items) return [{ ...root, items }]; // wrap! } } // Example run: let array = [{name: 'Name1',items: [{name: 'Name1.1',items: [{ id: '1', name: 'Name1.1.1' },{ id: '2', name: 'Name1.1.2' },{ id: '3', name: 'Name1.1.3' },],},{name: 'Name1.2',items: [{ id: '4', name: 'Name1.2.1' },{ id: '5', name: 'Name1.2.2' },],},],},{name: 'Name2',items: [{name: 'Name2.1',items: [{ id: '6', name: 'Name2.1.1' },{ id: '7', name: 'Name2.1.2' },],},],},]; console.log(getPath(array, '4'));