web-dev-qa-db-ja.com

Array.prototype.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、私はどこでそれを台無しにしていますか?ありがとうございました!

35

return filteredArr.Push(collectionElement)を実行しようとすると、基本的に、Push操作の後に、filteredArrの長さを返します。 Push()メソッドは、配列の最後に1つ以上の要素を追加し、配列の新しい長さを返します。参照: 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;
}, []);
49
Paulpro

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);
  }
}, []);

次の反復でアキュムレータの値を使用できるように、アキュムレータを返す必要があります。

9
Josh Beam