Javascript 递归检查树上的条件并在找到时停止
我有这样一个基本的树数据结构(忘记缺少的父属性): 我想写一个函数,它接受任何项,可以是根,也可以是任何子项,并对它进行一些评估 例如:Javascript 递归检查树上的条件并在找到时停止,javascript,typescript,recursion,tree,Javascript,Typescript,Recursion,Tree,我有这样一个基本的树数据结构(忘记缺少的父属性): 我想写一个函数,它接受任何项,可以是根,也可以是任何子项,并对它进行一些评估 例如: public doCheck(item: TreeItem): boolean { item.children.forEach( (i: TreeItem) => { return this.doCheck(i); }); return (item.children.some( (i: TreeItem) =>
public doCheck(item: TreeItem): boolean {
item.children.forEach( (i: TreeItem) => {
return this.doCheck(i);
});
return (item.children.some( (i: TreeItem) => i.value >= 10));
}
但是,现在它似乎正确地遍历了树,但只返回求值(item.children.some((i:TreeItem)=>i.value>=10))
,就好像它是单独在根项上调用的,对于根项它永远不会为真
我哪里出错了?不清楚你到底想做什么,但这部分:
item.children.forEach( (i: TreeItem) => {
return this.doCheck(i);
});
没有什么意义,因为您在这里基本上什么都没做。您可能正在寻找以下内容:
public doCheck(item: TreeItem): boolean {
return
item.children.some(i => i.value >= 10)
&&
item.children.some(i => this.doCheck(i));
}
可能是|
而不是&&
这当然可以更改为:
public doCheck(item: TreeItem): boolean {
return item.children.some(i => i.value >= 10 && this.doCheck(i));
}
您希望摆脱
forEach
,而是在some
中递归
我假设value
出现在children中的条目上。如果是:
function doCheck(item) {
// If `children` is optional, you could add
// `item.children &&` just after `return`
return item.children.some(entry => entry.value >= 10 || doCheck(entry));
}
console.log(doCheck(data)); // true or false
var数据={
名称:'根',
数据:[],
数值:5,
儿童:[
{
姓名:‘child_1’,
数据:[],
儿童:[],
数值:10,
},
{
姓名:‘child_2’,
数据:[],
儿童:[],
价值:20
},
]
};
功能检查(项目){
//如果“children”是可选的,您可以添加
//`item.children&&`just after`return`
返回item.children.some(entry=>entry.value>=10 | | doCheck(entry));
}
console.log(doCheck(data));//是的,因为'child_1'有它
请更新问题,向我们展示一个有效的数据示例
。您的示例没有value
属性(您的代码查找一个),我们不知道该属性显示在哪里。这关系到你如何解决这个问题。@T.J.Crowder感谢你指出这一点,做出了改变。这很好,感谢你的解决方案。虽然与@Nitzan的解决方案非常相似,但我们会将其标记为答案,因为它是第一个完整的代码片段。
function doCheck(item) {
// If `children` is optional, you could add
// `item.children &&` just after `return`
return item.children.some(entry => entry.value >= 10 || doCheck(entry));
}
console.log(doCheck(data)); // true or false