const data = [ { title: '0-0', key: '0-0', children: [ { title: '0-0-0', key: '0-0-0', children: [ { title: '0-0-0-0', key: '0-0-0-0' }, { title: '0-0-0-1', key: '0-0-0-1' }, { title: '0-0-0-2', key: '0-0-0-2' }, ], }, { title: '0-0-1', key: '0-0-1', children: [ { title: '0-0-1-0', key: '0-0-1-0' }, { title: '0-0-1-1', key: '0-0-1-1' }, { title: '0-0-1-2', key: '0-0-1-2' }, ], }, { title: '0-0-2', key: '0-0-2', }, ], }, { title: '0-1', key: '0-1', children: [ { title: '0-1-0-0', key: '0-1-0-0' }, { title: '0-1-0-1', key: '0-1-0-1' }, { title: '0-1-0-2', key: '0-1-0-2' }, ], }, { title: '0-2', key: '0-2', }, ];¿Cómo obtendría una matriz de todos los valores en todos los nidos de este obj por la clave de id.
Por ejemplo
entrada: ["0-0-0"]
quiero salida como esta
salida: ["0-0-0", "0-0-0-0", "0-0-0-1", "0-0-0-2"]
Puede recorrer recursivamente todos los elementos children y obtener las claves que coincidan con una de las claves de destino o si alguno de sus ancestros ha coincidido con una de las claves de destino.
const data = [ { title: "0-0", key: "0-0", children: [ { title: "0-0-0", key: "0-0-0", children: [ { title: "0-0-0-0", key: "0-0-0-0" }, { title: "0-0-0-1", key: "0-0-0-1" }, { title: "0-0-0-2", key: "0-0-0-2" }, ], }, { title: "0-0-1", key: "0-0-1", children: [ { title: "0-0-1-0", key: "0-0-1-0" }, { title: "0-0-1-1", key: "0-0-1-1" }, { title: "0-0-1-2", key: "0-0-1-2" }, ], }, { title: "0-0-2", key: "0-0-2", }, ], }, { title: "0-1", key: "0-1", children: [ { title: "0-1-0-0", key: "0-1-0-0" }, { title: "0-1-0-1", key: "0-1-0-1" }, { title: "0-1-0-2", key: "0-1-0-2" }, ], }, { title: "0-2", key: "0-2", }, ]; function getKeys(data, targetKeys) { const targetKeysSet = new Set(targetKeys); const outputKeys = []; function getKeysHelper(data, hasParentMatched = false) { data?.forEach((d) => { if (targetKeysSet.has(d.key) || hasParentMatched) { outputKeys.push(d.key); getKeysHelper(d.children, true); } else { getKeysHelper(d.children); } }); } getKeysHelper(data); return outputKeys; } getKeys(data, ["0-0-0"]);Documentaciones relevantes:
puedes hacer algo como esto
const extractKeys = data => { const loop = (data, res) => { if(!data.children){ return [...res, data.key] } return data.children.flatMap(d => loop(d, [...res, data.key])) } return [...new Set(loop(data, []))] } const findKeys = (data, keys) => data.flatMap(extractKeys).filter(k => keys.some(key => k.includes(key))) const data = [ { title: '0-0', key: '0-0', children: [ { title: '0-0-0', key: '0-0-0', children: [ { title: '0-0-0-0', key: '0-0-0-0' }, { title: '0-0-0-1', key: '0-0-0-1' }, { title: '0-0-0-2', key: '0-0-0-2' }, ], }, { title: '0-0-1', key: '0-0-1', children: [ { title: '0-0-1-0', key: '0-0-1-0' }, { title: '0-0-1-1', key: '0-0-1-1' }, { title: '0-0-1-2', key: '0-0-1-2' }, ], }, { title: '0-0-2', key: '0-0-2', }, ], }, { title: '0-1', key: '0-1', children: [ { title: '0-1-0-0', key: '0-1-0-0' }, { title: '0-1-0-1', key: '0-1-0-1' }, { title: '0-1-0-2', key: '0-1-0-2' }, ], }, { title: '0-2', key: '0-2', }, ]; console.log(findKeys(data, ['0-0-0']))