以下功能给出错误的输出
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
第二个功能给出正确的输出,为什么?
都使用递归函数。
下面的函数给出了错误的输出函数searchFn(obj,searchText){让结果;如果(obj.name === searchText)返回obj;如果(obj ['children'] && obj ['children']。length> ...
forEach
执行而不会中断循环。当您分配result
时,它总是接收该项目的最后一个值。
forEach
的返回值将被忽略。在您的第一个代码中,您递归遍历整个结构,但是在result
内部返回的forEach
变量没有任何作用-最后,在循环之外,return result || null
仅返回结果调用searchFn
作为obj.children
中的最终项目。