类似forEach与循环的不同行为

时间:2017-12-21 18:28:19

标签: javascript

我有以下代码块,每个代码块都有相同的用途。出于某种原因,for循环产生的结果与forEach循环的结果不同,我不完全确定原因。

this._domains.forEach(domain => {
    if ((userDomain.name === domain.domainName) || (userDomain.fullyQualifiedDomainName === domain.netBiosName) ||
        (userDomain.name === domain.netBiosName)) { return domain; }
    });
}
return null;
for (let index = 0; index < this._domains.length; index++) {
    if ((userDomain.name === this._domains[index].domainName) ||
        (userDomain.fullyQualifiedDomainName === this._domains[index].netBiosName) ||
        (userDomain.name === this._domains[index].netBiosName)) {
        return this._domains[index];
    }
}
return null;

第二个for循环给出了预期的结果,而第一个forEach循环似乎失败或每次都变为null。

我在这里错过任何想法或事物?即使我不打算从迭代中创建一个新数组,这仍然是使用其他更高阶技术的好机会,例如mapfilterreduce

由于

2 个答案:

答案 0 :(得分:3)

forEach回调中的回复是针对回调本身,而不是你的外部函数。

如果您尝试返回单个值,则forEach是错误的选择。使用find

function myFunc( userDomain ) {

    return this._domains.find( domain =>
        userDomain.name === domain.domainName ||
        userDomain.fullyQualifiedDomainName === domain.netBiosName ||
        userDomain.name === domain.netBiosName );

}

或者,如果您将结果存储在myFunc内声明的变量中,则可以使用forEach。

答案 1 :(得分:1)

forEach()函数将迭代每个元素并调用作为参数给出的回调函数。没有办法在休息或返回时停止它。

如果某些回调函数返回一个值,它对外部函数没有影响,并且对forEach的结果没有任何影响,这在任何情况下都是未定义的。

如果您需要在列表中的每个项目上调用一个可以调用副作用的函数,则应该使用forEach。

请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach