web-dev-qa-db-ja.com

reduce関数を使用して配列を返す

Reduce関数内でPush関数を使用して新しい配列を返すとエラーになるのはなぜですか。ただし、reduce関数内でconcatメソッドを使用すると、問題なく新しい配列が返されます。

私がやろうとしているのは、配列をreduce関数に渡し、同じ配列を返すことです。

var store = [0,1,2,3,4];

var stored = store.reduce(function(pV,cV,cI){
  console.log("pv: ", pV);
  return pV.Push(cV);
},[]);

これはエラーを返します。しかし、concatを使用する場合:

var store = [0,1,2,3,4];

var stored = store.reduce(function(pV,cV,cI){
  console.log("pv: ", pV);
  return pV.concat(cV);
},[]);

同じ配列を返します。

なぜアイデアがありますか?

26
2K01B5

Pushは、配列の新しい長さを返します。

必要なのは、最初に提供された配列です。

以下のようにコードを変更します。

var store = [0, 1, 2, 3, 4];

var stored = store.reduce(function(pV, cV, cI){
  console.log("pv: ", pV);
  pV.Push(cV);
  return pV; // *********  Important ******
}, []);

concatは、指定された配列の要素と連結された要素を組み合わせた新しい配列を返します。動作します。

46
Venkata Raju

完全を期すために、そしてこの質問で次に起こる人のために、あなたがしていることは通常、 map で達成されます。

mapは、配列内の各要素に対して提供されたコールバック関数を順番に1回呼び出し、結果から新しい配列を作成します

reduce の説明とは対照的です。

Reduce()メソッドは、アキュムレータと配列の各値(左から右へ)に対して関数を適用し、それを単一の値に減らします

(エンファシス鉱山)canを操作してreduceを操作して新しい配列を返しますが、一般的な使用法は配列を単一の値に減らすことです。

したがって、コードの場合、これは次のようになります。

var store = [0,1,2,3,4];

var stored = store.map(function(pV){
  console.log("pv: ", pV);
  return pV;
});

Push関数内でconcatまたはreduceを使用して新しい配列を再構築しようとするよりもはるかに簡単です。

18
Jamiec

reduceは、反復されるアイテムごとに複数のアイテムを持つ配列を返す必要がある場合に役立ちます。

var inputs = media.reduce((passedArray, video) => { passedArray.Push("-i"); passedArray.Push(video.filepath); return passedArray; }, []);

ここでは、ffmpegの入力配列を構築するために使用されています。

[{名前: "bob"、ファイルパス: "1.mp4"}、{名前: "sue"、ファイルパス: "3.mp4"}]

=> ["-i"、 "1.mp4"、 "-i"、 "2.mp4]

1
abitofcode

Array.prototype.Push メソッドは、配列の新しい長さを返します。

Array.prototype.concat メソッドは、新しい要素を配列に挿入し、さらに処理できるように配列を返します。これは、reduceで必要なことです。変更された配列を次の反復に渡します。

1
dfsq