Array.prototype.reduce()の主な目的として、最も適切なものはどれか?
解説
正解は「配列の要素を順に処理し、単一の値に集約する」です。reduce()は配列を左から右へなめていき、前回の処理結果(アキュムレータ)と現在の要素を使って最終的に1つの値を作り出すメソッドです。なぜその答えなのか条件に合う要素だけを抽出 — それはfilter()の仕事です。reduce()でも同じことは書けますが、わざわざやる理由がありません。各要素を変換して同じ長さの配列を返す — map()ですね。入力と出力の要素数が1対1で対応する変換はmap()の領分です。要素の並び替え — sort()やtoSorted()の役割です。reduce()は順序の変更を目的としたメソッドではありません。要するに、filterは「間引く」、mapは「変換する」、sortは「並べ替える」、そしてreduceは「まとめ上げる」。この棲み分けを押さえておくと迷いません。背景・仕組みreduce()はES5.1で標準化されましたが、もともと関数型プログラミングにおけるfold(畳み込み)と呼ばれる操作が由来です。コールバックは4つの引数を受け取ります。配列名.reduce( コールバック関数(合計値の結果, 要素の値), 初期値 ) 配列名.reduce((accumulator, currentValue, index, array) => { // accumulatorに結果を蓄積していく return updatedAccumulator; }, initialValue);第2引数のinitialValueは省略可能ですが、空配列で呼ぶとTypeErrorになるため、実務では常に指定するのが安全です。省略した場合は配列の先頭要素が初期値になり、ループは2番目の要素から始まります。この挙動を知らずにハマる人は多いです。実務での活用例合計値の算出 — 一番わかりやすい使い方です。const total = [100, 200, 300].reduce((sum, n) => sum + n, 0); // 600配列からオブジェクトへの変換 — APIから返ってきた配列をIDをキーにした辞書に変えたいとき、地味に重宝します。const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' } ]; const byId = users.reduce((map, user) => { map[user.id] = user; return map; }, {});使いすぎに注意 — reduce()は万能ナイフですが、filter+mapで済む処理を無理に1つのreduceに詰め込むと読みにくくなります。「集約して1つの値にする」場面で使い、それ以外は専用メソッドに任せるのがチームで嫌われないコツです。