【りでゅーすかんすう】

reduce関数 とは?

💡 配列をギュッと「一つの値に煮詰める」関数
📌 このページのポイント
reduce関数の畳み込みフロー 配列 [1, 2, 3, 4] 0 初期値 + 1 = 1 1 + 2 = 3 3 + 3 = 6 6 + 4 = 10 reduce のしくみ accumulator(累積値)と currentValue(現在の要素)を 繰り返し処理して1つの値にする arr.reduce((acc, cur) => acc + cur, 0) 合計・集計・変換など 多様な用途に使える万能関数
reduce関数のイメージ
ひよこ ひよこ

reduce関数ってどういうものなの?

ペンギン先生 ペンギン先生

配列の要素を左から順に「一つの値にまとめていく」関数だよ。たとえば合計を求めるなら「[1,2,3,4].reduce((sum, n) => sum + n, 0)」と書く。sumが累積値(アキュムレータ)で、最初は0、1を足して1、次に2を足して3…と順に積み上げて最終的に10になるんだ。

ひよこ ひよこ

mapやfilterとは何が違うの?

ペンギン先生 ペンギン先生

mapとfilterは「配列から配列を作る」けど、reduceは「配列から何でも作れる」のが特徴だよ。数値、文字列オブジェクト、さらには配列も作れる。理論上はmapもfilterもreduceで実装できるんだ。だからreduceは「配列操作の万能ナイフ」と言われるよ。

ひよこ ひよこ

reduce関数で注意することってある?

ペンギン先生 ペンギン先生

初期値(第2引数)を省略すると配列の最初の要素が初期値になるんだけど、空の配列でreduceを呼ぶとエラーになるから、初期値は必ず指定するのが安全だよ。あとreduceは万能すぎて複雑なロジックを詰め込みがちだけど、読む人が「何をしているか」理解しにくくなるから、mapやfilterで書けるならそちらのほうがいい。reduceは「他では書けない集計処理」に使うのがベストプラクティスだよ。

ひよこ ひよこ

reduceってパフォーマンスは良いの?

ペンギン先生 ペンギン先生

配列を1回走査するだけだから基本的には効率的だよ。ただしアキュムレータで新しいオブジェクトを毎回作る(スプレッド構文でコピーするなど)と、大きな配列でO(n^2)になってしまうことがある。その場合はforループやforEachのほうが速いこともあるんだ。

ひよこ ひよこ

他の言語にもreduce関数ってあるの?

ペンギン先生 ペンギン先生

たくさんの言語にあるよ。Pythonではfunctools.reduce()、RubyではEnumerable#inject、JavaではStream.reduce()、Rustではiter().fold()が同等の機能。関数型プログラミングでは「fold(折りたたみ)」と呼ばれることが多くて、reduceは左からの折りたたみ(foldl)に対応するんだ。Haskellにはfoldlとfoldr(右からの折りたたみ)の両方があるよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「reduce関数」って出てきたら「配列の全要素を処理して一つの値にまとめる関数だな」と思えればだいたいOK!
📖 おまけ:英語の意味
「reduce」 = 減らす・縮める
💬 複数の要素を一つに「減らしていく」イメージ。数学では「畳み込み(fold)」とも呼ばれるよ
← 用語集にもどる