Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 递归检查树上的条件并在找到时停止_Javascript_Typescript_Recursion_Tree - Fatal编程技术网

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