为何无法使用forEach遍历树形结构?附代码示例分析
为什么用forEach遍历树形结构的子节点时,contains函数无法正确找到值?
其实问题出在forEach的特性上,你在forEach回调里的return el.contains(value)根本不会影响外层的contains函数——它只是从当前的箭头函数里返回,既不会终止forEach循环,也不会把找到的true传递出去。
咱们拆解下你的代码逻辑:
- 先检查当前节点的值是否匹配,匹配就返回true,这部分没问题。
- 然后用forEach遍历子节点,每个子节点调用
contains方法。哪怕某个子节点的contains返回了true,这个true也只是回调函数的返回值,forEach会继续遍历剩下的子节点,完全不会让外层函数停下来。 - 最后不管子节点里有没有找到目标值,都会执行到
return false,这就是为什么你找7和3的时候都返回false的原因。
解决方法:用some代替forEach
some方法天生适合这种"只要有一个满足条件就返回true"的场景——它会遍历数组,一旦回调函数返回true,就立即停止遍历,并把true返回给外层函数。修改后的代码如下:
Tree.prototype.contains = function (value) { if (this.value === value) return true; // some会帮我们判断是否有子节点能找到目标值 return this.children.some(el => el.contains(value)); };
另一种方案:手动用for循环
如果你更习惯用循环控制,也可以用for...of循环,找到匹配项就直接return true,终止函数:
Tree.prototype.contains = function (value) { if (this.value === value) return true; for (const child of this.children) { if (child.contains(value)) { return true; } } return false; };
这两种修改后,你再运行测试代码:
console.log('2: ',myTree.contains(2)) // true console.log('7: ',myTree.contains(7)) // true console.log('3: ',myTree.contains(3)) // true
结果就都正确了。
内容的提问来源于stack exchange,提问作者OctaviaLo
相关产品推荐
相关产品推荐

