【JavaScript】reduce()メソッド

  • URLをコピーしました!

reduceメソッドとは、配列を反復処理する関数の一種です。

第一引数にコールバック関数、第二引数に初期値を指定できます↓

Array.prototype.reduce(callbackFn,initialValue);

初期値が指定された場合、配列の0番目から反復処理を実行します。省略されると、配列の0番目の値を初期値に設定し、1番目の値から反復処理を行います。

つまり、初期値を設定するかしないかで反復回数が変わります。

目次

第一引数:コールバック関数の中身

reduceメソッドのコールバック関数の中身について調べました。

引数には、以下の四つを指定できます↓

  • previousValue(第一引数)
  • currentValue(第二引数)
  • currentIndex(第三引数)
  • array(第四引数)

引数名は任意に指定できます。

それぞれについて簡単に説明します。

previousValueとは

前回のコールバック関数実行時に返された値です。

初回実行時は、第二引数のinitialValueの値です。initialValueが指定されていなければ、配列の0番目の値が該当します。

currentValueとは

現在の配列の値です。

初回実行時は、initialValueが指定されている場合、配列の0番目の値です。そうでなければ、配列の1番目の値です。

currentIndexとは

currentValueの配列の番号です。

初回実行時は、initialValueが指定されている場合、0です。そうでなければ、1です。

arrayとは

反復対象の配列です。

第二引数:initialValueとは

コールバック関数を初めて実行した時のpreviousValueの初期値です。initialValueを省略するとpreviousValueの値は、配列の0番目の値となります。

この引数はcurrentValueにも関係します。

initialValueが指定されている場合、curretnValueの初期値は配列の0番目の値となります。そうでなければ、配列の1番目の値となります。

返り値

コールバック関数を実行した結果を得ることができ、配列や文字列など全ての型を返すことができます。

例外

配列に要素がなく、かつinitialValueが省略されるとエラーが発生します。

実際のコードに当てはめる

これまでの説明を実際のコードに当てはめます。

initialValueが指定・省略によって挙動が変わるため分けて考えます。

initialValueが指定されている場合

const array = [1,2,3,4];
const initialValue = 0;

const sum = array.reduce((previousValue,currentValue,currentIndex,aray) => {
  console.log(`反復対象の配列: [${aray}]`);
  console.log(`反復回数: ${currentIndex + 1}回目`);
  console.log(`previousValue: ${previousValue}, currentValue: ${currentValue}`);
  return previousValue + currentValue;
},initialValue)

console.log(`結果:${sum}`);

/*
【初回の出力結果】
反復対象の配列: [1, 2, 3, 4]
反復回数: 1回目
previousVal: 0, currentValue: 1
結果:1→2回目のpreviousValueになる

【2回目の出力結果】
反復対象の配列: [1, 2, 3, 4]
反復回数: 2回目
previousVal: 1, currentValue: 2
結果:3→3回目のpreviousValueになる

【3回目の出力結果】
反復対象の配列: [1, 2, 3, 4]
反復回数: 3回目
previousValue: 3, currentValue: 3
結果:6→4回目のpreviousValueになる

【4回目の出力結果】
反復対象の配列: [1, 2, 3, 4]
反復回数: 4回目
previousValue: 6, currentValue: 4
結果:10→反復終了。最終的な値は「10」となる。
*/

initialValueが省略された場合

const array = [1,2,3,4];

const sum = array.reduce((previousValue,currentValue,currentIndex,aray) => {
  console.log(`反復対象の配列: [${aray}]`);
  console.log(`反復回数: ${currentIndex}回目`);
  console.log(`previousVal: ${previousValue}, currentValue: ${currentValue}`);
  return previousValue + currentValue;
})

console.log(`結果:${sum}`);

/*
【初回の出力結果】
反復対象の配列: [1, 2, 3, 4]
反復回数: 1回目
previousVal: 1, currentValue: 2
結果:3→2回目のpreviousValueになる

【2回目の出力結果】
反復対象の配列: [1, 2, 3, 4]
反復回数: 2回目
previousVal: 3, currentValue: 3
結果:6→3回目のpreviousValueになる

【3回目の出力結果】
反復対象の配列: [1, 2, 3, 4]
反復回数: 3回目
previousValue: 6, currentValue: 4
結果:10→反復終了。最終的な値は「10」となる
*/

結果は同じですが、反復回数やpreviousValue、currentValueが一部変わっていることが分かります。

省略すると少し挙動がややこしいので、僕は初期値を指定します。

エラーが起きる場合

エラーは、配列の中身が空でinitialValueが省略された場合に起こります↓

const sum = [].reduce((previousValue,currentValue,currentIndex,aray) => {
  return previousValue + currentValue;
})

console.log(`結果:${sum}`); // TypeError: Reduce of empty array with no initial value

また、空の配列でinitialValueが指定された場合、コールバック関数は実行されずinitialValueが返り値として与えられます↓

const sum = [].reduce((previousValue,currentValue,currentIndex,aray) => {
  return previousValue + currentValue;
},10000)

console.log(`結果:${sum}`); // 結果:10000

参考サイト

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次