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
    , []) || [];
}