【りでゅーすかんすう】

reduce関数 とは?

最終更新:
💡 途中の結果を受け渡し、要素を一つの結果へまとめる

複数の要素に対して、途中の結果を次の処理へ渡しながら一つの結果を作る関数。JavaScriptの配列では、設定されている要素を添字の小さい順に処理する。

📌 このページのポイント
reduce:途中の結果を次へ渡す [1, 2, 3, 4] / 初期値 0 累積値 要素 戻り値 0 + 1 = 1 1 + 2 = 3 3 + 3 = 6 6 + 4 = 10 戻り値を、次の処理の累積値にする JavaScriptの加算例。最終結果は10
初期値0から、累積値と今の要素を足すJavaScriptの例。コールバックの戻り値を次へ渡し、最後の値10を結果として返す。
ひよこ ひよこ
reduceって、どうやってまとめるの?
ペンギン先生 ペンギン先生
JavaScriptでは、累積値と今の要素をコールバックへ渡すよ。その戻り値を次の累積値にして進むんだ。たとえば [1,2,3,4].reduce((sum,n)=>sum+n,0) は、0→1→3→6→10と足し、最後に10を返すよ。
ひよこ ひよこ
mapやfilterとは違うの?
ペンギン先生 ペンギン先生
mapは各要素を変換した配列、filterは条件に合う要素の配列を作るよ。reduceの結果は数値に限らず、オブジェクトや配列にもできる。ただし使い方が複雑になるなら、目的を読み取りやすい関数やループを選ぶといいね。
ひよこ ひよこ
最初の0を省いたらどうなる?
ペンギン先生 ペンギン先生
初期値を省くと、最初の存在する要素が累積値になるよ。コールバックはその次の要素から始まる。空配列なら、初期値があればその値を返し、なければTypeErrorになる。途中のコールバックで値を返し忘れると、次の累積値はundefinedになるんだ。
ひよこ ひよこ
配列の全ての場所を処理するの?
ペンギン先生 ペンギン先生
JavaScriptでは、要素が設定されていない場所は飛ばすよ。値としてundefinedが入っている場所は処理するので、両者は別なんだ。たとえば [1,,3] は真ん中が未設定。添字が小さい順に、存在する要素を使って進めるよ。
ひよこ ひよこ
reduceなら速いの?
ペンギン先生 ペンギン先生
関数名だけで速さは決まらないよ。各処理で大きくなる配列やオブジェクトを丸ごとコピーすると、要素数に対して処理量が大きく増える場合がある。必要な処理・読みやすさ・実際の性能を比べて選ぼう。
ひよこ ひよこ
JavaScript以外でもある?
ペンギン先生 ペンギン先生
Pythonにはfunctools.reduceがあり、反復できるデータへ左から累積処理を行うよ。たとえばreduce(lambda a,b:a+b,[1,2,3],0)は6になる。同じ名前でも言語の仕様は別なので、処理順や初期値のルールは使う言語の資料で確認しよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「reduce関数」って出てきたら「途中の結果を次へ渡しながら、要素を一つの結果にまとめる関数」と思えばだいたいOK!
📖 おまけ:英語の意味
「reduce」 = 減らす・縮める
💬 Reduceは減らすという意味。複数の要素を、一つの累積結果へまとめていくイメージだよ。

参考資料

← 用語集にもどる