为什么两个函数给出具有相同方法的不同输出?

时间:2020-04-04 06:50:52

标签: 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 = 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

第二个函数给出正确的输出为什么?

两个函数都使用递归。

2 个答案:

答案 0 :(得分:1)

forEach执行时不会中断循环。在分配result时,它总是接收到该项目的最后一个值。

另一方面,

.some将在某些条件匹配时停止循环并返回true。因此这里result会在条件匹配时以及退出循环之前接收值

答案 1 :(得分:1)

forEach的返回值将被忽略。在第一个代码中,您递归地遍历整个结构,但是在result内部返回的forEach变量没有任何作用-最后,在循环之外,{{1} }将仅返回调用return result || null中最后一项的searchFn的结果。

如果您希望能够直接返回递归调用,请使用obj.children方法进行短路,或使用.some循环,您可以在其中for进行循环终止父函数:

return
相关问题