Javascript使用递归函数从树中查找节点
我有这样的Javascript使用递归函数从树中查找节点,javascript,tree,iterator,Javascript,Tree,Iterator,我有这样的JavaScript树数据 const树={ 儿童:[ {id:10,子项:[{id:34,子项:[]},{id:35,子项:[]},{id:36,子项:[]}, {id:10, 儿童:[ {id:34,儿童:[ {id:345,子项:[]} ]}, {id:35,儿童:[]}, {id:36,儿童:[]} ] }, {id:11,子项:[{id:30,子项:[]},{id:33,子项:[]},{id:3109,子项:[]} ], 身份证号码:45 } const getByID=
JavaScript
树数据
const树={
儿童:[
{id:10,子项:[{id:34,子项:[]},{id:35,子项:[]},{id:36,子项:[]},
{id:10,
儿童:[
{id:34,儿童:[
{id:345,子项:[]}
]},
{id:35,儿童:[]},
{id:36,儿童:[]}
]
},
{id:11,子项:[{id:30,子项:[]},{id:33,子项:[]},{id:3109,子项:[]}
],
身份证号码:45
}
const getByID=(树,id)=>{
让结果为空
if(id==tree.id){
回归树
}否则{
if(树、子对象){
tree.children.forEach(节点=>{
结果=getByID(节点,id)
})
}
返回结果
}
}
const find345=getByID(树,345)
console.log(find345)
您需要使用允许查找时短路的方法退出循环
访问节点但已找到该节点的问题是,将结果替换为后来的错误结果。您需要提前退出找到的节点
允许迭代并在返回truty值时退出循环。在这种情况下,结果是真实的
const tree={children:[{id:10,children:[{id:34,children:[]},{id:36,children:[]},{id:10,children:[{id:34,children:[{id:345,children:[]},{id:35,children:[]},{id:36,children:[]}},{id:11,children id:30,children id:33,children:[]},{id:3109,子项:[]}],id:45};
const getByID=(树,id)=>{
让结果为空
if(id==tree.id){
回归树
}否则{
if(树、子对象){
some(node=>result=getByID(node,id));
//^^^^如果找到,则退出
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^返回并分配
}
返回结果;
}
}
const find345=getByID(树,345)
log(find345)
我们也可以对递归函数使用reduce方法
function findAllByKey(obj, keyToFind) {
return Object.entries(obj)
.reduce((acc, [key, value]) => (key === keyToFind)
? acc.concat(value)
: (typeof value === 'object' && value)
? acc.concat(findAllByKey(value, keyToFind))
: acc
, []) || [];
}