你的例子有点奇怪,但是由于这个问题正在成为规范的“从forEach返回”问题,让我们用更简单的东西来演示这个问题:
这里,我们有一个函数检查数组中的条目以查看 someProp 是否与 value 匹配,如果匹配,则递增条目上的 count 并返回条目:
function updateAndReturnMatch(array, value) {
array.forEach(function(entry) {
if (entry.someProp == value) {
++entry.count;
return entry;
}
});
}
但调用updateAndReturnMatch 会得到undefined,即使找到并更新了该条目。
原因是forEach 回调中的return 从回调返回,而不是从updateAndReturnMatch。请记住,回调是一个函数;函数中的return 从 that 函数返回,而不是包含它的函数。
要从updateAndReturnMatch返回,我们需要记住入口并打破循环。因为你不能打破 forEach 循环,我们将使用 some 代替:
function updateAndReturnMatch(array, value) {
var foundEntry;
array.some(function(entry) {
if (entry.someProp == value) {
foundEntry = entry;
++foundEntry.count;
return true; // <== Breaks out of the `some` loop
}
});
return foundEntry;
}
return true 从我们的 some 回调返回,return foundEntry 从 updateAndReturnMatch 返回。
有时这就是你想要的,但上面的模式通常可以替换为Array#find,这是 ES2015 中的新功能,但可以为旧版浏览器填充:
function updateAndReturnMatch(array, value) {
var foundEntry = array.find(function(entry) {
return entry.someProp == value;
});
if (foundEntry) {
++foundEntry.count;
}
return foundEntry;
}