🔄

JavaScript配列の強力な味方: Array.prototype.reduce()の活用ガイド

2024/08/18に公開

Array.prototype.reduce()とは

Array.prototype.reduce()は、JavaScriptの配列メソッドの中でも特に強力で柔軟性の高いメソッドです。このメソッドは配列の各要素に対して、ユーザーが定義したコールバック関数を実行し、単一の結果値を生成します。

基本的な構文は以下のようになります:

array.reduce(callback(accumulator, currentValue, index, array), initialValue)
  • callback: 各要素に対して実行される関数
  • accumulator: 前回のコールバックの戻り値、または初期値
  • currentValue: 現在処理中の配列の要素
  • index: 現在処理中の要素のインデックス(省略可能)
  • array: reduce()が呼び出された配列(省略可能)
  • initialValue: accumulatorの初期値(省略可能)

以下では、reduce()の3つの強力なユースケースを紹介します。

1. 複数の配列操作を1回のイテレーションで行う

reduce()を使用すると、複数の操作を1回のループで効率的に実行できます。以下の例では、金融取引のデータを処理し、複数の集計を同時に行っています:

const transactions = [
  { type: 'deposit', amount: 100 },
  { type: 'withdrawal', amount: 50 },
  { type: 'deposit', amount: 200 },
  { type: 'withdrawal', amount: 30 }
];

const result = transactions.reduce((acc, transaction) => {
  // 預金の場合、totalDepositに加算
  if (transaction.type === 'deposit') {
    acc.totalDeposit += transaction.amount;
  } else {
    // 引き出しの場合、totalWithdrawalに加算
    acc.totalWithdrawal += transaction.amount;
  }
  // 残高の計算(預金は加算、引き出しは減算)
  acc.balance += transaction.type === 'deposit' ? transaction.amount : -transaction.amount;
  // 取引回数のカウント
  acc.transactionCount++;
  return acc;
}, { totalDeposit: 0, totalWithdrawal: 0, balance: 0, transactionCount: 0 });

console.log(result);
// {
//   totalDeposit: 300,
//   totalWithdrawal: 80,
//   balance: 220,
//   transactionCount: 4
// }

2. 複雑なデータ構造の変換

reduce()は、複雑なデータ構造を別の形式に変換する際にも非常に有用です。例えば、オブジェクトの配列をキーと値のペアに変換する場合:

const people = [
  { id: 1, name: "Alice", age: 30 },
  { id: 2, name: "Bob", age: 25 },
  { id: 3, name: "Charlie", age: 35 }
];

const peopleMap = people.reduce((acc, person) => {
  // personオブジェクトのidをキーとして、新しいオブジェクトを作成
  acc[person.id] = { name: person.name, age: person.age };
  return acc;
}, {});

console.log(peopleMap);
// {
//   '1': { name: 'Alice', age: 30 },
//   '2': { name: 'Bob', age: 25 },
//   '3': { name: 'Charlie', age: 35 }
// }

3. 状態を保持しながらの配列処理

reduce()は、処理の過程で状態を保持しながら配列を操作するのに適しています。以下の例では、数値の配列から複数の統計情報を同時に計算しています:

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

const result = numbers.reduce((acc, num, index, array) => {
  // 最初の要素の場合、初期値として設定
  if (index === 0) {
    acc.min = num;
    acc.max = num;
  } else {
    // 最小値と最大値の更新
    acc.min = Math.min(acc.min, num);
    acc.max = Math.max(acc.max, num);
  }
  // 合計の計算
  acc.sum += num;
  
  // 最後の要素の場合、平均値を計算
  if (index === array.length - 1) {
    acc.average = acc.sum / array.length;
  }
  
  return acc;
}, { min: Infinity, max: -Infinity, sum: 0, average: 0 });

console.log(result);
// { min: 1, max: 10, sum: 55, average: 5.5 }

まとめ

Array.prototype.reduce()は、その柔軟性と強力さゆえに、多くの複雑なデータ処理タスクを簡潔かつ効率的に実行できます。単一のループで複数の操作を行うことで、コードの可読性と性能の両方を向上させることができます。

今回紹介した例のように、金融取引の分析、データ構造の変換、統計計算など、実際のプログラミングで直面する様々な課題にreduce()を適用できます。

株式会社くりぼー

Discussion