【初心者向け】JavaScript: reduce() 関数でエラーなく空の配列を処理する方法とサンプルコード


JavaScript の reduce() 関数を使って空の配列を処理しようとすると、Errors: Reduce of empty array with no initial value というエラーが発生します。これは、reduce() 関数が空の配列を処理できないためです。

原因

reduce() 関数は、配列の各要素を処理し、最終的な値を返します。処理には、初期値と処理関数が必要です。初期値は、最初の要素を処理する前に使用されます。処理関数は、各要素と前の要素に基づいて新しい値を返します。

空の配列の場合、reduce() 関数は処理する要素がないため、エラーが発生します。

解決策

このエラーを解決するには、以下のいずれかの方法を実行します。

  1. 初期値を指定する

    reduce() 関数に初期値を指定すると、空の配列であっても処理が行えます。初期値は、配列の最初の要素として使用されます。

    const emptyArray = [];
    const result = emptyArray.reduce((initialValue, currentValue) => {
        // 処理内容
    }, initialValue);
    
  2. 空の配列かどうかを確認する

    reduce() 関数を実行する前に、配列が空かどうかを確認します。空の場合は、処理を行わないようにします。

    const emptyArray = [];
    if (emptyArray.length === 0) {
        // 処理なし
    } else {
        const result = emptyArray.reduce((initialValue, currentValue) => {
            // 処理内容
        }, initialValue);
    }
    


以下のコードは、空の配列を reduce() 関数で処理しようとした場合に発生するエラーと、その解決策を示しています。

const emptyArray = [];

// 初期値を指定しない場合
try {
    const result = emptyArray.reduce((currentValue) => {
        // 処理内容
    });
} catch (error) {
    console.error(error); // Errors: Reduce of empty array with no initial value
}

// 初期値を指定する場合
const result1 = emptyArray.reduce((initialValue, currentValue) => {
    // 処理内容
}, 0);
console.log(result1); // 0

// 空の配列かどうかを確認する場合
if (emptyArray.length === 0) {
    console.log('配列は空です');
} else {
    const result2 = emptyArray.reduce((initialValue, currentValue) => {
        // 処理内容
    }, 0);
    console.log(result2);
}


初期値を指定する

const emptyArray = [];

const result = emptyArray.reduce((initialValue, currentValue) => {
  return initialValue + currentValue;
}, 0);

console.log(result); // 0

空の配列かどうかを確認する

以下のコードは、空の配列かどうかを確認してから reduce() 関数を実行する例です。

const emptyArray = [];

if (emptyArray.length === 0) {
  console.log('配列は空です');
} else {
  const result = emptyArray.reduce((initialValue, currentValue) => {
    return initialValue + currentValue;
  }, 0);
  console.log(result); // 0
}

初期値を関数として指定する

以下のコードは、初期値を関数として指定し、空の配列であっても処理を行う例です。

const emptyArray = [];

const result = emptyArray.reduce((initialValue) => {
  // 初期値を計算する処理
  return 10;
}, (initialValue, currentValue) => {
  // 配列の要素を処理する処理
  return initialValue + currentValue;
});

console.log(result); // 10

以下のコードは、reduce() 関数のオプション引数を使ってデフォルト値を設定する例です。

const emptyArray = [];

const result = emptyArray.reduce((initialValue = 0, currentValue) => {
  return initialValue + currentValue;
});

console.log(result); // 0


このエラーを回避するには、以下の代替方法を使用することができます。

初期値を指定する

最も一般的な方法は、reduce() 関数の第二引数に初期値を指定することです。初期値は、最初の要素を処理する前に使用されます。

const emptyArray = [];
const initialValue = 0;

const result = emptyArray.reduce((currentValue, previousValue) => {
  return currentValue + previousValue;
}, initialValue);

console.log(result); // 0

空の配列かどうかを確認する

reduce() 関数を実行する前に、配列が空かどうかを確認する方法もあります。空の場合は、処理を行わないようにします。

const emptyArray = [];

if (emptyArray.length === 0) {
  console.log('配列は空です');
} else {
  const result = emptyArray.reduce((currentValue, previousValue) => {
    return currentValue + previousValue;
  }, 0);

  console.log(result); // 0
}

reduceRight() 関数を使用する

reduceRight() 関数は、reduce() 関数と似ていますが、処理方向が逆になります。つまり、最後の要素から最初に処理されます。空の配列の場合、reduceRight() 関数は初期値をそのまま返します。

const emptyArray = [];
const initialValue = 0;

const result = emptyArray.reduceRight((currentValue, previousValue) => {
  return currentValue + previousValue;
}, initialValue);

console.log(result); // 0

forEach() 関数を使用する

すべての要素を処理する必要がある場合は、forEach() 関数を使用してループする方法もあります。

const emptyArray = [];
let sum = 0;

emptyArray.forEach(element => {
  sum += element;
});

console.log(sum); // 0

上記以外にも、以下のような代替方法があります。

  • 配列を map() 関数を使用して新しい配列を作成してから reduce() 関数を使用する
  • 配列を filter() 関数を使用して空要素を除去してから reduce() 関数を使用する
  • 条件分岐を使用して、空の配列の場合に別の処理を行う