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;
  }
}