为什么 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 累加器,以便下一次迭代可以使用累加器的值。
我正在尝试将数组中大于 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 累加器,以便下一次迭代可以使用累加器的值。