この記事では配列を操作するメソッド『reduceメソッド』について、以下の内容をサンプルコードを用いて分かりやすく説明するように心掛けています。ご参考になれば幸いです。
reduce
メソッドとはreduce
メソッドの構文reduce
メソッドの使い方- 配列の要素の合計を計算する
- 配列の要素を結合する
- 最大値・最小値を求める
- オブジェクトの配列を一つのオブジェクトに変換する
- ネストされた配列をフラットにする
reduce
メソッドの特徴- 配列が空の場合にはエラーになる
- 空の要素はスキップするが、値が
undefined
の場合はスキップしない
reduceメソッドとは
reduce
メソッドは、配列の隣り合う2つの要素に対して左から右へ関数を実行し、最終的に単一の値を生成するメソッドです。例えば、配列の中身を一つずつ足していって合計を求めることができます。
後ほどreduceメソッドの構文や使い方について詳しく説明しますが、まず以下に示す簡単なサンプルコードを見てみましょう。
const array = [1, 2, 3, 4, 5];
const sum = array.reduce(
(accumulator, currentValue) => accumulator + currentValue
);
console.log(sum); // 15
このサンプルコードでは、配列array
の要素の合計値を計算し、変数sum
に格納しています。
reduceメソッドの構文
reduce
メソッドの構文を以下に示します。
reduceメソッドの構文
array.reduce(callback [, initialValue])
array
は処理対象の配列です。reduce
メソッドの引数と返り値を以下に示します。
引数
callbackFn
- 配列の各要素に対して実行される関数です。この関数は以下の引数を取ります。
accumulator
- 前回の
callbackFn
の呼び出し結果の値です。 - 初回の
callbackFn
実行時、initialValue
が指定されていた場合はinitialValue
、そうでない場合はarray[0]
の値になります。
- 前回の
currentValue
- 現在処理されている要素の値です。
- 初回の
callbackFn
実行時、initialValue
が指定された場合はarray[0]
、そうでない場合はarray[1]
の値になります。
currentIndex
(省略可能)- 現在処理されている要素のインデックスです。
- 初回の
callbackFn
実行時、initialValue
が指定された場合は0
、そうでない場合は1
になります。
array
(省略可能)- reduceが呼び出された処理対象の配列です。
initialValue
(省略可能)callbackFn
が最初に呼び出された時にaccumulator
が初期化される値です。initialValue
が指定されている場合- 初回の
callbackFn
実行時、accumulator
にはinitialValue
、currentValue
には配列の最初の値array[0]
が入ります。
- 初回の
initialValue
が省略されている場合- 初回の
callbackFn
実行時、accumulator
には配列の最初の値array[0]
、currentValue
には配列の2番目の値array[1]
が入ります。
- 初回の
返り値(戻り値)
reduce
メソッドは配列全体にわたってコールバック関数を実行した結果の値を返します。
ではこれからサンプルコードを用いて詳しく説明します。
reduceメソッドの使い方
reduce
メソッドについて、以下に示している使い方を順番に説明します。
- 配列の要素の合計を計算する
- 配列の要素を結合する
- 最大値・最小値を求める
- オブジェクトの配列を一つのオブジェクトに変換する
- ネストされた配列をフラットにする
配列の要素の合計を計算する
reduce
メソッドを使うと、配列の要素の合計を計算することができます。
以下のサンプルコードでは、配列array
の各要素の合計値を求めています。
const array = [1, 2, 3];
const sum = array.reduce(
(accumulator, currentValue, currentIndex) => accumulator + currentValue
);
console.log(sum); // 15
上記のサンプルコードでは説明を分かりやすくするためにcallbackFn
の引数(array
)とinitialValue
を省略しています。コールバック関数callbackFn
は 2回実行され、各回の引数の内容は以下のようになります。
callbackFn実行回数 | accumulator | currentValue | currentIndex | callbackFnの返り値 |
---|---|---|---|---|
1回目 | 1 | 2 | 1 | 3 |
2回目 | 3 | 3 | 2 | 6 |
callbackFn
実行1回目のaccumulator
には、配列の1番目の要素である1
が入り、currentValue
には2番目の要素である2
が入ります。callbackFn
が実行されると、1 + 2
で3
が返されます。
callbackFn
実行2回目のaccumulator
には、1つ前の要素で実行されたcallbackFn
の返り値である3
が入り、currentValue
には3番目の要素である3
が入ります。そしてcallbackFn
が実行されると、3 + 3
で6
が返されます。
reduce
メソッドの返り値は、callbackFn
呼び出しの最後の返り値である6
となります。
配列の要素を結合する
reduce
メソッドは、配列の要素を結合して一つの文字列にすることもできます。
以下のサンプルコードでは、配列words
内の各要素をスペースで結合して一つの文字列sentence
にしています。reduce
メソッドは、最初の要素'Hello'
を初期値とし、次の要素'World'
を結合していきます。この処理をすべての要素に対して行うことで、最終的に'Hello World from JavaScript'
が出力されます。
const words = ['Hello', 'World', 'from', 'JavaScript'];
const sentence = words.reduce(
(accumulator, currentValue) => accumulator + ' ' + currentValue
);
console.log(sentence); // 'Hello World from JavaScript'
最大値・最小値を求める
reduce
メソッドは、配列の要素から最大値・最小値を求めることもできます。
以下のサンプルコードでは、Math.max
を使用して配列numbers
の最大値を求めています。具体的には、初期値として-Infinity
を指定し、配列numbers
内の各要素と比較して最大のものをaccumulator
に保持します。最終的に、配列numbers
の各要素の最大値である8
が出力されます。
const numbers = [5, 1, 8, 3, 2];
const max = numbers.reduce(
(accumulator, currentValue) => Math.max(accumulator, currentValue),
-Infinity
);
console.log(max); // 8
オブジェクトの配列を一つのオブジェクトに変換する
reduce
メソッドは、オブジェクトの配列を一つのオブジェクトに変換することもできます。
以下のサンプルコードでは、配列people
内の各オブジェクトをname
をキー、age
を値とする新しいオブジェクトpeopleByName
に変換しています。reduce
メソッドを使用して、各人の名前と年齢を新しいオブジェクトのプロパティとして追加しています。最終的に{ Alice: 25, Bob: 30, Charlie: 35 }
が出力されます。
const people = [
{ name: 'Alice', age: 25 },
{ name: 'Bob', age: 30 },
{ name: 'Charlie', age: 35 },
];
const peopleByName = people.reduce((accumulator, person) => {
accumulator[person.name] = person.age;
return accumulator;
}, {}); // 初期値を{}にしている
console.log(peopleByName); // { Alice: 25, Bob: 30, Charlie: 35 }
ネストされた配列をフラットにする
reduce
メソッドは、ネストされた配列をフラットにすることもできます。
以下のサンプルコードでは、ネストされた配列nestedArray
を一つのフラットな配列flatArray
に変換しています。reduce
メソッドを使用して、各サブ配列をaccumulator
に連結していきます。初期値として空の配列[]
を指定し、全ての要素を結合することで[1, 2, 3, 4, 5]
が出力されます。
const nestedArray = [[1, 2], [3, 4], [5]];
const flatArray = nestedArray.reduce(
(accumulator, currentValue) => accumulator.concat(currentValue),
[]
);
console.log(flatArray); // [1, 2, 3, 4, 5]
reduceメソッドの特徴
reduce
メソッドの特徴を以下に示します。
- 配列が空の場合にはエラーになる
- 空の要素はスキップするが、値が
undefined
の場合はスキップしない
各特長について順番に説明します。
配列が空の場合にはエラーになる
配列が空で初期値が指定されていない場合、reduce
メソッドはエラーを投げます。
以下のサンプルコードでは、空の配列emptyArray
に対して初期値を指定せずにreduce
メソッドを実行しています。その結果、エラーTypeError: Reduce of empty array with no initial value
が投げられます。空の配列に対してreduce
を使用する場合、初期値を指定することが重要です。
const emptyArray = [];
try {
const result = emptyArray.reduce(
(accumulator, currentValue) => accumulator + currentValue
);
} catch (e) {
console.error(e); // TypeError: Reduce of empty array with no initial value
}
空の要素はスキップするが、値が undefined の場合はスキップしない
reduce
メソッドは、疎配列の欠落している要素はスキップしますが、値がundefined
の要素はスキップしません。
以下のサンプルコードでは、配列[1, 2, , 4]
の欠落している要素はスキップされ、1 + 2 + 4 = 7
が結果として出力されます。
一方、配列[1, 2, undefined, 4]
のundefined
はスキップされず、1 + 2 + undefined + 4
となり、NaN
が結果として出力されます。
console.log([1, 2, , 4].reduce((a, b) => a + b)); // 7
console.log([1, 2, undefined, 4].reduce((a, b) => a + b)); // NaN
本記事のまとめ
この記事では配列を操作するメソッド『reduceメソッド』について、以下の内容を説明しました。
reduce
メソッドとはreduce
メソッドの構文reduce
メソッドの使い方- 配列の要素の合計を計算する
- 配列の要素を結合する
- 最大値・最小値を求める
- オブジェクトの配列を一つのオブジェクトに変換する
- ネストされた配列をフラットにする
reduce
メソッドの特徴- 配列が空の場合にはエラーになる
- 空の要素はスキップするが、値が
undefined
の場合はスキップしない
お読み頂きありがとうございました。