-
绝地无双
这非常接近。path考虑在递归函数中传递整个数组。以下是您完成此操作的稍微修改的版本。function getPath(model, id, path) { if (!path) { path = []; } if (model == null) { return; } if (model.id === id) { console.log(model.id, path) } if (model.children) { model.children.forEach(child => getPath(child, id, [...path, model.id])); }}const object = { id: "1", name: "a", children: [ { id: "2", name: "b", children: [ { id: "3", name: "c" } ] }, { id: "4", name: "d" } ]};getPath(object, "3");
-
慕少森
您可以使用短路来迭代子级并将函数的路径与目标对象一起移交。function getPath(model, id) { var path, item = { id: model.id }; if (!model || typeof model !== 'object') return; if (model.id === id) return [item]; (model.children || []).some(child => path = getPath(child, id)); return path && [item, ...path]; }const object = { id: "1", name: "a", children: [{ id: "2", name: "b", children: [{ id: "3", name: "c" }] }, { id: "4", name: "d" }] };console.log(getPath(object, '42')); // undefinedconsole.log(getPath(object, '3')); // [{ id: 1 }, { id: 2 }, { id: 3 }].as-console-wrapper { max-height: 100% !important; top: 0; }
-
浮云间
const object = { id: "1", name: "a", children: [ { id: "2", name: "b", children: [ { id: "3", name: "c" }, { id: "5", name: "c" } ] }, { id: "4", name: "d" } ]};const getPath = (obj, id, paths = []) => { if (obj.id == id) return [{ id: obj.id }]; if (obj.children && obj.children.length) { paths.push({ id: obj.id }); let found = false; obj.children.forEach(child => { const temPaths = getPath(child, id); if (temPaths) { paths = paths.concat(temPaths); found = true; } }); !found && paths.pop(); return paths; } return null;};console.log(getPath(object, "5"));console.log(getPath(object, "2"));console.log(getPath(object, "3"));console.log(getPath(object, "4"));.as-console-row {color: blue!important}