以下功能给出的输出不正确
function searchFn(obj, searchText) {
let result;
if (obj.name === searchText) return obj;
if (obj['children'] && obj['children'].length > 0) {
obj['children'].forEach((i) => {
result = searchFn(i, searchText);
return result
})
}
return result || null
}
以下功能可以正确显示
function searchFn(object, searchText) {
var result;
if (object.name === searchText) return object;
(object.children || []).some((o) =>{
result = searchFn(o, searchText)
return result
});
return result || null;
}
为什么会发生?我第一次使用forEach
,第二次使用some
函数。
有人解释为什么会这样吗?
let tree = { name: "A", children: [{ name: 'A-1', children: [{ name: "A-1-A" }, { name: "A-1-B" }] }, { name: 'B-1', children: [{ name: "B-1-A", children: [{ name: "B-11-A" }, { name: "B-11-B" }] }, { name: "B-1-B" }] }] };
console.log(searchFn(tree, 'A-1'));
预期输出是
{名称:'A-1',子级:[{名称:“ A-1-A”},{名称:“ A-1-B”}]}
第一个功能我得到 null
第二个函数给出正确的输出为什么?
两个函数都使用递归。
答案 0 :(得分:1)
forEach
执行时不会中断循环。在分配result
时,它总是接收到该项目的最后一个值。
.some
将在某些条件匹配时停止循环并返回true
。因此这里result
会在条件匹配时以及退出循环之前接收值
答案 1 :(得分:1)
forEach
的返回值将被忽略。在第一个代码中,您递归地遍历整个结构,但是在result
内部返回的forEach
变量没有任何作用-最后,在循环之外,{{1} }将仅返回调用return result || null
中最后一项的searchFn
的结果。
如果您希望能够直接返回递归调用,请使用obj.children
方法进行短路,或使用.some
循环,您可以在其中for
进行循环终止父函数:
return