JavaScript reduce関数の基本的な使い方
JavaScript
のreduce
関数の基本的な使い方を説明します。
以下のコードはreduce関数を使って配列の合計値を求めています。
var arr = [1, 2, 3, 4, 5];
var sum = arr.reduce(function (result, current) {
return result + current;
}, 0);
console.log(sum); // 15
解説
配列.reduce(関数, 初期値);
としたとき、reduce
関数は、配列の要素を1つづつ引数で指定した関数の処理を実行していきます。
文章で説明するのは難しいので、上記のサンプルをログ出力しながら確認します。
var arr = [1, 2, 3, 4, 5];
var sum = arr.reduce(function (result, current) {
console.log('result=' + result + ' current=' + current);
return result + current;
}, 0);
/* 出力結果
result=0 current=1
result=1 current=2
result=3 current=3
result=6 current=4
result=10 current=5
*/
forEach
のように、配列の要素の数だけ指定した関数が実行されます。
forEach
と違うのは関数の引数と関数にreturn
があるところです。
result
には関数でreturn
した値が入ります。最初の要素の場合はreturn
した値が存在しないことになりますが、reduce
関数の第2引数がresult
の初期値となります。
上記の例では0
を指定しているので、最初の要素のresult
は0
になっていることを出力結果から確認できます。
current
には現在の要素の値が入ります。こちらはforEach
と同じイメージで、配列の要素の値が1つづつ順番に入ります。
result
とcurrent
の値に対して何かしらの処理をしてその結果をreturn
すれば、配列の集計が簡単に行えるようになります。
例えばSQL
の集計関数のように配列のMax
、Min
、Count
をreduce
関数で実装するには以下のようにします。Min
の場合は初期値が0
だと0
が最小値になってしまうので、null
を初期値にしています。
var arr = [1, 2, 3, 4, 5];
var max = arr.reduce(function (result, current) {
return result < current ? current : result; // Max
}, 0);
var min = arr.reduce(function (result, current) {
if (result == null) return current;
return result > current ? current : result; // Min
}, null);
var count = arr.reduce(function (result, current) {
return result + 1; // Count
}, 0);
console.log(max); // 5
console.log(min); // 1
console.log(count); // 5
配列の長さ(Count
)を取得したい場合はlength
を使えばいいですし、Max
やMin
を取得したい場合はJavaScript 配列の要素で最大値・最小値を取得するで紹介した方法を使ったほうが簡単です。
個人的にはreduce
関数が本領発揮するのはオブジェクト配列の集計時だと感じています。
オブジェクトの配列でも考え方は同じです。JavaScript オブジェクト配列をsqlのgroup byのように集計するでオブジェクト配列での集計方法を紹介します。
IE8以下の対応
IE8
以下はreduce
関数が使用できません。
下記のURLで紹介されているfunction
を実装すればreduce
関数を使用できるようになります。