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

时间:2015-09-18 01:34:19

标签: javascript arrays reduce

我试图将数组中大于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,我在哪里搞砸了?谢谢!

2 个答案:

答案 0 :(得分:48)

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

您需要从匿名函数返回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;
}, []);

答案 1 :(得分:9)

Array.prototype.concat将返回新数组的长度。你需要返回累加器。一个简洁的方法是使用var collection = [3, 5, 11, 23, 1]; var output = collection.reduce(function(filteredArr, collectionElemet) { if (collectionElemet > 10) { return filteredArr.concat(collectionElemet); } }, []); ,因为该方法实际上将返回数组:

layout_height="70dp"

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