【JavaScript】reduce – 配列の要素を累積的に処理し1つの値にまとめる

JavaScriptのreduce()メソッドは、配列の要素を累積的に処理し、1つの値にまとめるメソッドです。今回は、reduce()の基本的な使い方から使用時の注意点までをまとめていきたいと思います。

reduce()メソッドとは?

reduce()メソッドは、配列の各要素に対して指定したコールバック関数を順番に適用し、1つの値を生成します。

基本構文

JavaScript
array.reduce((累積値, 現在の要素, インデックス, 配列) => {
    // 処理内容
}, 初期値);

パラメータ

  • 累積値(accumulator):前回の処理結果を保持する変数
  • 現在の要素(currentValue):現在処理中の要素
  • インデックス(index)(省略可能):現在の要素のインデックス
  • 配列(array)(省略可能):処理中の元の配列
  • 初期値(optional):累積値の初期値(指定しない場合は配列の最初の要素)

基本的な使い方

配列の合計を計算する

JavaScript
let numbers = [10, 20, 30, 40];
let sum = numbers.reduce((acc, num) => acc + num, 0);

console.log(sum); // 100

accに各要素numを加算して、配列の合計を求めます。初期値0からスタートし、10 + 20 + 30 + 40 = 100となるのでconsole.log100と表示されます。

配列の最大値を求める

JavaScript
let numbers = [5, 12, 8, 130, 44];
let max = numbers.reduce((acc, num) => (num > acc ? num : acc), numbers[0]);

console.log(max); // 130

accには現在の最大値が保持され、numと比較して大きい方を次のaccとして引き継ぎます。初期値は配列の最初の要素は5です。512を比較して、大きい方の12accに引き継がれ、次に128を比較…を繰り返し結果console.log130が表示されます。

オブジェクトのプロパティを合計する

JavaScript
let products = [
    { name: 'コーヒーサーバー', price: 500 },
    { name: 'ドリッパー', price: 800 },
    { name: 'ケトル', price: 1000 }
];

let totalPrice = products.reduce((acc, product) => acc + product.price, 0);

console.log(totalPrice); // 2300

product.priceaccに加算して、すべての商品の合計金額を求める例です。console.logには合計金額の2300が表示されます。

サンプルコード

配列内の要素をグループ化する

JavaScript
let drinks = ['coffee', 'cappuccino', 'espresso', 'coffee', 'espresso', 'coffee'];

let drinkCount = drinks.reduce((acc, drink) => {
    acc[drink] = (acc[drink] || 0) + 1;
    return acc;
}, {});

console.log(drinkCount);
// { coffee: 3, cappuccino: 1, espresso: 2 }
  • accはオブジェクトで、各飲み物の出現回数をカウントします。
  • acc[drink] || 0 で初期値を 0 に設定し、カウントを増やします。

使用時の注意点

初期値を設定しないとエラーが発生する可能性がある

JavaScript
let numbers = [];

let sum = numbers.reduce((acc, num) => acc + num);
// TypeError: Reduce of empty array with no initial value

解決策: 初期値を設定することでエラーを防ぐことができます。

JavaScript
let sum = numbers.reduce((acc, num) => acc + num, 0);

reduce()は可読性が低くなることがある

reduce()は強力なメソッドですが、可読性が低くなる場合があります。複雑な処理を行う場合は、forループやmap()+ filter()との併用も検討しましょう。