为什么 Array.prototype.reduce() 不将空数组作为累加器?

Why Array.prototype.reduce() is not taking an empty array as accumulator?

我正在尝试将数组中大于 10 的所有元素过滤到一个新数组中。我故意不使用 Array.prototype.filter() 因为我想学习 reduce() 方法。这是我正在玩的代码

var collection = [3, 5, 11, 23, 1];

// fileter all the elements bigger than 10 to a new array

var output = collection.reduce(function(filteredArr, collectionElemet) {
  if (collectionElemet > 10) {
    return filteredArr.push(collectionElemet);
  }
}, []);

我原以为 filteredArr 会在第一次回调执行时用一个空数组初始化,因为它发生在提供的许多示例中 here。但是当我 运行 这段代码时,我得到了错误 Cannot read property 'push' of undefined,我哪里搞砸了?谢谢!

当您尝试执行 return filteredArr.push(collectionElement) 时,本质上您是在推送操作后 returning filteredArr 的长度。 push() 方法将一个或多个元素添加到数组的末尾,并且 returns 是数组的新长度。 参考:Array.prototype.push().

您需要从您的匿名函数中 return filteredArr,以便它用作下一次调用的 previousValue

var collection = [3, 5, 11, 23, 1];

// filter all the elements bigger than 10 to a new array

var output = collection.reduce(function(filteredArr, collectionElement) {
  if (collectionElement > 10) {
    filteredArr.push(collectionElement);
  }
  return filteredArr;
}, []);

Array.prototype.push 将 return 新数组的长度。您需要 return 累加器。一种简洁的方法是使用 Array.prototype.concat,因为该方法实际上 return 数组:

var collection = [3, 5, 11, 23, 1];

var output = collection.reduce(function(filteredArr, collectionElemet) {
  if (collectionElemet > 10) {
    return filteredArr.concat(collectionElemet);
  }
}, []);

您必须 return 累加器,以便下一次迭代可以使用累加器的值。