IT・WEB・ゲーム業界の転職に強いR-Stone

転職コラム

Javascriptのreduce()とは?メソッドや使い方をわかりやすくご紹介

JavaScriptプログラミングで、配列操作は重要な要素です。配列操作のなかでも、reduce()メソッドは特に強力な機能を持っています。配列の要素を集約するreduce()は、複雑なデータ処理や累積計算を効率的にコーディングできます。

本記事では、reduce()の基本的な使い方から、他のメソッドとの違い、注意点まで詳しく解説します。JavaScriptの力を引き出すためにも、ぜひreduce()をマスターしましょう。

JavaScriptのreduce()とは

JavaScriptのreduce()メソッドは、配列の要素を処理して単一の値を返す関数です。

配列の要素に順に関数を適用し、結果を累積していくシンプルな機能ですが、複雑なデータ処理もできる汎用性があります。

const numbers = [5, 2, 8, 9, 3];

const max = numbers.reduce(Math.max); // 配列の最大値を見つける

console.log(max); // 9

map()との違い

reduce()とmap()は、どちらも配列を操作するメソッドで、関数を引数にしますが、目的や出力は異なります。

map()は各要素に対して関数を適用し、新しい配列を返します。一方、reduce()は要素を集約して単一の値を返します。

 

目的

返値

出力例

reduce()

各要素を集約

単一の値

全要素の合計

map()

各要素に関数を適用

新しい配列

各要素を2倍

filterとの違い

filterは条件に合う要素を抽出して新しい配列を作成しますが、reduce()は単一の値を返します。

 

目的

返値

出力例

reduce()

各要素を集約

単一の値

全要素の積

filter()

条件に合う要素を抽出

新しい配列

偶数の要素

reduce()の使い方・メソッド

reduce()メソッドの基本的な使い方や、重要となる引数を見ていきましょう。

基本的な書き方

reduce()メソッドの基本的な構文は以下のとおりです。

array.reduce(callback(accumulator, currentValue, index, array), 初期値)

callbackは、配列の各要素に対して実行されるコールバック関数で、4つの引数を受け取ります。

引数

説明

accumulator

蓄積値(前回のコールバック関数の戻り値)

currentValue

現在処理中の配列の要素

※indexとarrayは次項で説明します。

初期値は、蓄積値の初期値です。省略可能ですが、指定をおすすめします。

例:要素の合計を計算する

const numbers = [1, 2, 3, 4, 5];

const sum = numbers.reduce((acc, cur) => acc + cur, 0);

console.log(sum); // 出力: 15

初期値に0を指定したので、初回のaccは0です。

各回のコールバック関数は以下の引数を処理し、値を返します。

回数

acc

cur

返値

初回

0

1

1

2回目

1

2

3

3回目

3

3

6

4回目

6

4

10

5回目

10

5

15

最後の5回目の返値がreduce()の結果となります。

コールバック関数の引数

reduce()のコールバック関数は、4つの引数を受け取ります。

引数

説明

accumulator

前回のコールバック関数の戻り値です。初回の呼び出し時は、初期値が指定されていれば初期値になります。

currentValue

現在処理中の要素です。配列の各要素が順番に渡されます。

index

現在処理中の要素のインデックスです。初期値が指定されている場合は0から、そうでない場合は1から始まります。

array

reduce()が呼び出された元の配列です。

引数を使用して、より複雑な処理ができます。

例:配列内の偶数番目の要素を合計する

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

const sumOfEvenIndexed = numbers.reduce((acc, cur, index) => {

    return index % 2 === 0 ? acc + cur : acc;   // 偶数番目は acc + cur 奇数番目は acc

}, 0);

console.log(sumOfEvenIndexed); // 25 (1 + 3 + 5 + 7 + 9)

上記のコードでは、accに前回までの合計値、curに現在の要素、indexに配列インデックスが入ります。インデックスが偶数の場合にcurを加算し、奇数の場合はそのままaccを返すことで、偶数番目のみ合計しています。

reduce()の注意点について

reduce()メソッドの注意点をいくつかご紹介します。

reduce()では、初期値を省略すると、空の配列ではTypeErrorが発生し、空でない配列では最初の要素が初期値として使用されるため、配列の内容がよく分かっている場合を除き、初期値を指定するのがおすすめです。

また、大きな配列に対してreduce()を使用する場合、コールバック関数内の処理が、実行時間に影響するため注意してください。

reduce()の使用によって副作用が生じる可能性にも注意が必要です。コールバック関数内で外部の変数を変更したり、APIを呼び出したりすると、予期せぬ動作を引き起こす可能性があります。 副作用を避けるには、コールバック関数で扱っている配列以外を変更しないことです。

まとめ

reduce()メソッドは、配列操作のなかでも特に汎用性が高く、さまざまな場面で活用できます。ただし、初期値の指定や副作用の回避など、いくつかの注意点があります。

注意点に気をつけながら、 自分のプロジェクトでreduce()を使う機会を見つけ、実践的なスキルを磨いていきましょう。