Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么Array.prototype.reduce()不将空数组作为累加器?_Javascript_Arrays_Reduce - Fatal编程技术网

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

Javascript 为什么Array.prototype.reduce()不将空数组作为累加器?,javascript,arrays,reduce,Javascript,Arrays,Reduce,我试图将数组中大于10的所有元素过滤到一个新数组中。我有意不使用Array.prototype.filter(),因为我想学习reduce()方法。这是我玩的代码 var集合=[3,5,11,23,1]; //将大于10的所有元素归档到新阵列 var输出=collection.reduce(函数(filteredar、collectionElemet){ 如果(集合元素>10){ 返回过滤器Darr.push(CollectionElement); } }, []);当您尝试执行返回Filte

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

var集合=[3,5,11,23,1];
//将大于10的所有元素归档到新阵列
var输出=collection.reduce(函数(filteredar、collectionElemet){
如果(集合元素>10){
返回过滤器Darr.push(CollectionElement);
}

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

您需要从匿名函数返回
filteredar
,以便将其用作下一次调用的

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将返回新数组的长度。你需要退回蓄能器。一种简洁的方法是使用
Array.prototype.concat
,因为该方法实际上会返回数组:

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

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

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

如果条件为真-您返回一个数字,如果不为真-您返回一个未定义的
。如果您只是想筛选-使用
Array.prototype.filter
,那么您当前的代码是丑陋和误导的。@zerkms:这对生产代码是公平的,而不是对教育/实验。OP明确表示他知道
过滤器
,但试图理解
减少
。不是我的否决票,而是concat每次都返回一个新数组,这是低效的。push是将新元素添加到现有数组中的明显选择。这并不总是关于效率,这是一个有效的答案,因为它说明了两件事,即如何在一行中生成解决方案以及@segmentationfaulter必须返回filteredArr。他的困惑可能是认为Filteredar.push会返回Filteredar。