JavaScriptのreduce()
メソッドは、配列の要素を累積的に処理し、1つの値にまとめるメソッドです。今回は、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.log
に100
と表示されます。
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
です。5
と12
を比較して、大きい方の12
がacc
に引き継がれ、次に12
と8
を比較…を繰り返し結果console.log
に130
が表示されます。
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.price
をacc
に加算して、すべての商品の合計金額を求める例です。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()
は強力なメソッドですが、可読性が低くなる場合があります。複雑な処理を行う場合は、for
ループやmap()
+ filter()
との併用も検討しましょう。