私は両方の方法を使用しましたが、両方の方法の使用に関してかなり混乱しています。
map
にできることはありますが、reduce
にはできませんか?
注:両方の方法の使用方法を知っていますが、これらの方法と使用する必要がある場合の主な違いについて疑問を持っています。
map
とreduce
の両方には、入力として定義した配列と関数があります。これらは何らかの形で補完的です。map
は複数の要素の配列に対して1つの要素を返すことはできませんが、reduce
は最終的に変更したアキュムレータを常に返します。
map
map
を使用して要素を反復処理し、各要素に対して必要な要素を返します。
たとえば、数値の配列があり、その正方形を取得したい場合、これを行うことができます。
// A function which calculates the square
const square = x => x * x
// Use `map` to get the square of each number
console.log([1, 2, 3, 4, 5].map(square))
reduce
配列を入力として使用すると、accumulator
およびcurrent_element
パラメーターを取得するコールバック関数(最初の引数)に基づいて、1つの要素(たとえば、オブジェクト、数値、または別の配列)を取得できます。
const numbers = [1, 2, 3, 4, 5]
// Calculate the sum
console.log(numbers.reduce(function (acc, current) {
return acc + current
}, 0)) // < Start with 0
// Calculate the product
console.log(numbers.reduce(function (acc, current) {
return acc * current
}, 1)) // < Start with 1
両方で同じことができる場合、どちらを選択する必要がありますか?コードがどのように見えるか想像してみてください。提供されている例では、reduce
を使用して、前述のように平方配列を計算できます。
// Using reduce
[1, 2, 3, 4, 5].reduce(function (acc, current) {
acc.Push(current*current);
return acc;
}, [])
// Using map
[1, 2, 3, 4, 5].map(x => x * x)
さて、これらを見ると、明らかに2番目の実装はより良く見え、より短くなっています。通常、よりクリーンなソリューションを選択します。この場合はmap
です。もちろん、reduce
を使用してそれを行うことができますが、簡単に言えば、どちらが短くなり、最終的にはより良いと思います。
一般に、「マップ」は一連の入力を等しい長さ一連の出力に変換することを意味し、「縮小」は一連の入力をより小さい出力数に変換することを意味します。
「map-reduce」が意味することは、通常、「変換、場合によっては並行して、連続的に結合」を意味すると解釈されます。
「マップ」するとき、x
をf(x)
で変換して新しい値x1
に変換する関数を作成します。 「削減」すると、配列y
を取り、配列y1
を出力する関数g(y)
を作成します。さまざまなタイプのデータを処理し、さまざまな結果を生成します。
この二つを一つ一つ見てみましょう
Map Mapはコールバックを受け取り、配列上のすべての要素に対して実行しますが、ユニークなのは既存の配列に基づいて新しい配列を生成する.
var arr = [1, 2, 3];
var mapped = arr.map(function(elem) {
return elem * 10;
})
console.log(mapped); // it genrate new array
Reduce配列オブジェクトのReduceメソッドを使用して、配列を1つの単一値に縮小します。
var arr = [1, 2, 3];
var sum = arr.reduce(function(sum, elem){
return sum + elem;
})
console.log(sum) // reduce the array to one single value
map()
関数は、入力配列の各要素に関数を渡すことで新しい配列を返します。
これは、配列と関数を同じ方法で受け取るreduce()
とは異なりますが、関数は2
入力(アキュムレータと現在の値)を受け取ります。
したがって、常に関数からの次の出力をアキュムレータに.concat
する場合は、reduce()
をmap()
のように使用できます。ただし、1次元を取得して1つの値を返すか、2次元配列を平坦化するなど、配列の次元を縮小するために使用されるのがより一般的です。