JavaScript Array.reduce() メソッド - 値を累積する
Array.reduce()の詳細解説。合計、グループ化、フラット化、複雑なデータ構造の構築。実例とベストプラクティスを含みます。無料リファレンス。
Iteration
詳細な説明
Array.reduce()を理解する
Array.reduce()は配列の各要素にリデューサー関数を実行し、前回の反復からの戻り値をアキュムレータとして渡します。最終結果は単一の累積値です — 数値、文字列、オブジェクト、配列、その他あらゆる型になり得ます。
構文
const result = array.reduce((accumulator, currentValue, index, array) => {
// 更新されたアキュムレータを返す
}, initialValue);
**常にinitialValueを提供してください。**これがないと、reduceは最初の要素を初期アキュムレータとして使用し、空配列でスローし、紛らわしい型エラーを引き起こします。
一般的なパターン
数値の合計:
const total = [1, 2, 3, 4, 5].reduce((sum, n) => sum + n, 0);
// total: 15
プロパティでグループ化:
const people = [
{ name: "Alice", dept: "Eng" },
{ name: "Bob", dept: "Sales" },
{ name: "Carol", dept: "Eng" }
];
const byDept = people.reduce((acc, person) => {
const key = person.dept;
acc[key] = acc[key] || [];
acc[key].push(person);
return acc;
}, {});
// byDept: { Eng: [{Alice}, {Carol}], Sales: [{Bob}] }
出現回数のカウント:
const fruits = ["apple", "banana", "apple", "cherry", "banana", "apple"];
const counts = fruits.reduce((acc, fruit) => {
acc[fruit] = (acc[fruit] || 0) + 1;
return acc;
}, {});
// counts: { apple: 3, banana: 2, cherry: 1 }
reduceを使うべきでない場合
より簡単なメソッドが存在する場合はそちらを使用してください:
- 合計?明確さのためにプレーンな
forループを検討 - フィルタリング + マッピング?
.filter().map()をチェーン - グループ化?利用可能な場合は
Object.groupBy()(ES2024)を使用
reduceは強力ですが、使いすぎると読みにくくなることがあります。
ユースケース
reduce()は、合計計算(ショッピングカート、統計)、カテゴリ別データグループ化、配列からルックアップオブジェクトの構築、出現回数のカウント、関数パイプラインの合成など、mapやfilterに適合しないあらゆる累積パターンに使用します。