Javascript 为什么两个函数给出了具有相同方法的不同输出?
下面的函数给出了不正确的输出Javascript 为什么两个函数给出了具有相同方法的不同输出?,javascript,Javascript,下面的函数给出了不正确的输出 function searchFn(obj, searchText) { let result; if (obj.name === searchText) return obj; if (obj['children'] && obj['children'].length > 0) { obj['children'].forEach((i) => { result =
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,在第二种方法中使用了一些函数
有人解释为什么会这样吗
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'));
预期产量为
{name:'A-1',子项:[{name:'A-1-A},{name:'A-1-B}]}
是我得到的第一个函数null
第二个函数给出正确的输出为什么
这两个函数都使用递归
forEach
执行时不会中断循环。当您分配结果时
,它总是接收项目的最后一个值
另一方面,
。当某些条件匹配时,某些
将停止循环,并返回true
。因此,在这里,result
将在条件匹配时以及在退出循环之前接收值forEach
在不中断循环的情况下执行。当您分配结果时
,它总是接收项目的最后一个值
另一方面,
。当某些条件匹配时,某些
将停止循环,并返回true
。因此,在这里,result
将在条件匹配时接收值,并且在退出循环之前,forEach
的返回值将被忽略。在第一个代码中,您递归地遍历整个结构,但是在forEach
中返回的result
变量没有任何作用-最后,在循环之外,returnresult | | null
将仅返回调用searchFn
中最后一项的obj.children
的结果
如果希望能够直接返回递归调用,请使用.some
方法短路,或使用for
循环,您可以返回
以终止父函数:
function searchFn(object, searchText) {
if (object.name === searchText) return object;
if (!object.children) return;
for (const child of object.children) {
const result = searchFn(o, searchText)
if (result) return result;
}
}
忽略
forEach
的返回值。在第一个代码中,您递归地遍历整个结构,但是在forEach
中返回的result
变量没有任何作用-最后,在循环之外,returnresult | | null
将仅返回调用searchFn
中最后一项的obj.children
的结果
如果希望能够直接返回递归调用,请使用.some
方法短路,或使用for
循环,您可以返回
以终止父函数:
function searchFn(object, searchText) {
if (object.name === searchText) return object;
if (!object.children) return;
for (const child of object.children) {
const result = searchFn(o, searchText)
if (result) return result;
}
}