読み込み中...

JavaScriptで理解するreduceRightの使い方10選

JavaScriptのreduceRightメソッドの使い方 JS
この記事は約18分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●reduceRightメソッドとは?

みなさん、JavaScriptの配列処理について学んでいて、「reduceメソッドは理解できたけど、reduceRightメソッドってどんなメソッドなんだろう?」と感じたことはありませんか?

reduceRightメソッドは、一見reduceメソッドと似ていますが、配列の要素を処理する順番が逆になっているんです。

○reduceメソッドとの違い

reduceメソッドは配列の先頭から順番に要素を処理していくのに対し、reduceRightメソッドは配列の末尾から先頭に向かって処理を行います。

つまり、reduceRightメソッドを使えば、配列の要素を右から左へと畳み込んでいくことができるわけです。

○reduceRightメソッドの構文

reduceRightメソッドの構文は次のようになります。

array.reduceRight(callback[, initialValue])

callbackは各要素に対して実行するコールバック関数、initialValueは畳み込みの初期値を指定するオプションの引数です。

コールバック関数の引数は、reduceメソッドと同様に「accumulator」「currentValue」「index」「array」の4つです。

○サンプルコード1:配列の合計値を計算する

それでは、reduceRightメソッドを使って、配列の合計値を計算してみましょう。

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

const sum = numbers.reduceRight((accumulator, currentValue) => {
  return accumulator + currentValue;
}, 0);

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

このコードでは、numbersという配列の要素を右から左に順番に足し合わせていき、最終的に合計値の15を求めています。

initialValueに0を指定することで、畳み込みの初期値を0に設定しています。

実行結果は次のようになります。

15

reduceRightメソッドを使うことで、シンプルに配列の合計値を計算することができましたね。

配列の要素を逆順に処理したい場合に、reduceRightメソッドは非常に便利なメソッドです。

●reduceRightメソッドの使いどころ

さて、reduceRightメソッドの基本的な使い方がわかったところで、次はどのようなシーンでreduceRightメソッドが活躍するのか、具体的に見ていきましょう。

配列の要素を逆順に処理したい場面では、reduceRightメソッドが非常に便利です。

例えば、配列の要素を逆順に連結したい場合や、二次元配列を一次元配列に変換したい場合などです。

○サンプルコード2:配列の要素を連結する

配列の要素を逆順に連結するために、reduceRightメソッドを使ってみましょう。

const fruits = ['apple', 'banana', 'orange'];

const reversedFruits = fruits.reduceRight((accumulator, currentValue) => {
  return accumulator + ', ' + currentValue;
});

console.log(reversedFruits); // 出力結果: "orange, banana, apple"

このコードでは、fruitsという配列の要素を逆順に連結しています。

コールバック関数の中で、accumulatorに現在の要素を追加していき、最終的に逆順に連結された文字列を得ることができます。

実行結果は次のようになります。

"orange, banana, apple"

このように、reduceRightメソッドを使えば、配列の要素を逆順に連結するのも簡単ですね。

○サンプルコード3:二次元配列を一次元配列に変換する

次は、二次元配列を一次元配列に変換する例を見てみましょう。

const matrix = [[1, 2], [3, 4], [5, 6]];

const flattenedArray = matrix.reduceRight((accumulator, currentValue) => {
  return accumulator.concat(currentValue);
}, []);

console.log(flattenedArray); // 出力結果: [5, 6, 3, 4, 1, 2]

このコードでは、matrixという二次元配列を一次元配列に変換しています。

コールバック関数の中で、accumulatorに現在の配列要素を結合していき、最終的に一次元配列を得ることができます。

initialValueには空の配列[]を指定しています。

実行結果は次のようになります。

[5, 6, 3, 4, 1, 2]

二次元配列を一次元配列に変換する際にも、reduceRightメソッドが役立ちます。

配列を逆順に処理することで、期待通りの結果を得ることができました。

○サンプルコード4:オブジェクトの値の合計を求める

最後に、オブジェクトのプロパティ値の合計を求める例を見てみましょう。

const salaries = {
  John: 1000,
  Jane: 1500,
  Mark: 2000
};

const totalSalary = Object.values(salaries).reduceRight((accumulator, currentValue) => {
  return accumulator + currentValue;
}, 0);

console.log(totalSalary); // 出力結果: 4500

このコードでは、salariesというオブジェクトのプロパティ値の合計を求めています。

まずObject.values()でオブジェクトの値を配列として取得し、その配列に対してreduceRightメソッドを適用しています。

コールバック関数の中で、accumulatorに現在の値を足し合わせていき、最終的に合計値を得ることができます。

実行結果は次のようになります。

4500

オブジェクトのプロパティ値を処理する際にも、reduceRightメソッドが活用できることがわかりますね。

●reduceRightメソッドの応用例

reduceRightメソッドの使いどころがわかったところで、次はもう少し実践的な応用例を見ていきましょう。

実際の開発現場でも役立つテクニックを、サンプルコードを交えて解説します。

○サンプルコード5:配列の要素を条件に応じてフィルタリングする

配列の要素を特定の条件で絞り込みたい場合、reduceRightメソッドを使ってフィルタリングすることができます。

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

const evenNumbers = numbers.reduceRight((accumulator, currentValue) => {
  if (currentValue % 2 === 0) {
    accumulator.unshift(currentValue);
  }
  return accumulator;
}, []);

console.log(evenNumbers); // 出力結果: [4, 2]

このコードでは、numbersという配列から偶数のみを抽出しています。

コールバック関数の中で、現在の要素が偶数であれば、accumulatorの先頭にその要素を追加しています。

最終的に、偶数のみが含まれた配列が得られます。

実行結果は次のようになります。

[4, 2]

このように、reduceRightメソッドとunshiftメソッドを組み合わせることで、配列の要素を条件に応じてフィルタリングできます。

○サンプルコード6:配列内のオブジェクトを特定のキーでグループ化する

配列内のオブジェクトを特定のキーでグループ化したい場合、reduceRightメソッドが活躍します。

const users = [
  { id: 1, name: 'John', age: 25 },
  { id: 2, name: 'Jane', age: 30 },
  { id: 3, name: 'John', age: 35 },
  { id: 4, name: 'Jane', age: 28 }
];

const groupedUsers = users.reduceRight((accumulator, currentValue) => {
  if (accumulator[currentValue.name]) {
    accumulator[currentValue.name].push(currentValue);
  } else {
    accumulator[currentValue.name] = [currentValue];
  }
  return accumulator;
}, {});

console.log(groupedUsers);
/*
出力結果:
{
  John: [
    { id: 3, name: 'John', age: 35 },
    { id: 1, name: 'John', age: 25 }
  ],
  Jane: [
    { id: 4, name: 'Jane', age: 28 },
    { id: 2, name: 'Jane', age: 30 }
  ]
}
*/

このコードでは、usersという配列内のオブジェクトを、nameプロパティでグループ化しています。

コールバック関数の中で、accumulatorオブジェクトにnameプロパティが存在すれば、そのプロパティの配列に現在のオブジェクトを追加し、存在しなければ新しい配列を作成しています。

最終的に、nameプロパティでグループ化されたオブジェクトが得られます。

実行結果は次のようになります。

{
  John: [
    { id: 3, name: 'John', age: 35 },
    { id: 1, name: 'John', age: 25 }
  ],
  Jane: [
    { id: 4, name: 'Jane', age: 28 },
    { id: 2, name: 'Jane', age: 30 }
  ]
}

このように、reduceRightメソッドを使えば、配列内のオブジェクトを特定のキーでグループ化することができます。

○サンプルコード7:多次元配列を一次元配列に平坦化する

多次元配列を一次元配列に平坦化する際にも、reduceRightメソッドが役立ちます。

const nestedArray = [[1, 2], [3, [4, 5]], [6, 7]];

const flattenedArray = nestedArray.reduceRight((accumulator, currentValue) => {
  return accumulator.concat(Array.isArray(currentValue) ? currentValue.reduceRight((acc, cur) => acc.concat(cur), []) : currentValue);
}, []);

console.log(flattenedArray); // 出力結果: [6, 7, 3, 4, 5, 1, 2]

このコードでは、nestedArrayという多次元配列を一次元配列に平坦化しています。

コールバック関数の中で、現在の要素が配列であれば、再帰的にreduceRightメソッドを適用して平坦化し、配列でなければそのまま結合しています。

最終的に、完全に平坦化された一次元配列が得られます。

実行結果は次のようになります。

[6, 7, 3, 4, 5, 1, 2]

多次元配列を一次元配列に変換する際に、reduceRightメソッドと再帰を組み合わせることで、シンプルに実装できます。

○サンプルコード8:文字列を逆順に並び替える

最後に、文字列を逆順に並び替える例を見てみましょう。

const str = 'Hello, World!';

const reversedStr = str.split('').reduceRight((accumulator, currentValue) => {
  return accumulator + currentValue;
}, '');

console.log(reversedStr); // 出力結果: "!dlroW ,olleH"

このコードでは、strという文字列を逆順に並び替えています。

まず、split(”)で文字列を個々の文字に分割し、その配列に対してreduceRightメソッドを適用しています。

コールバック関数の中で、accumulatorに現在の文字を順番に結合していき、最終的に逆順の文字列が得られます。

実行結果は次のようになります。

"!dlroW ,olleH"

文字列を逆順に並び替える際にも、reduceRightメソッドが威力を発揮します。

●reduceRightメソッドのよくあるエラーと対処法

reduceRightメソッドを使っていると、時々エラーに遭遇することがあるかもしれません。でも大丈夫です。

ここでは、よくあるエラーとその対処法を見ていきましょう。エラーメッセージから原因を読み取り、適切に対処できるようになることが大切ですね。

○「TypeError: Reduce of empty array with no initial value」エラー

このエラーは、reduceRightメソッドを空の配列に対して実行し、かつinitialValueを指定していない場合に発生します。

const arr = [];
const result = arr.reduceRight((accumulator, currentValue) => {
  return accumulator + currentValue;
});
// TypeError: Reduce of empty array with no initial value

エラーメッセージからわかるように、空の配列に対してreduceRightメソッドを実行する際は、必ずinitialValueを指定する必要があります。

const arr = [];
const result = arr.reduceRight((accumulator, currentValue) => {
  return accumulator + currentValue;
}, 0); // initialValueを指定
console.log(result); // 出力結果: 0

initialValueを指定することで、エラーが解消されます。

空の配列に対してreduceRightメソッドを使う場合は、必ずinitialValueを忘れずに指定しましょう。

○「TypeError: callback is not a function」エラー

このエラーは、reduceRightメソッドのコールバック関数が正しく指定されていない場合に発生します。

const arr = [1, 2, 3, 4, 5];
const result = arr.reduceRight();
// TypeError: callback is not a function

エラーメッセージから、コールバック関数が指定されていないことがわかります。

reduceRightメソッドを使う際は、必ずコールバック関数を指定する必要があります。

const arr = [1, 2, 3, 4, 5];
const result = arr.reduceRight((accumulator, currentValue) => {
  return accumulator + currentValue;
});
console.log(result); // 出力結果: 15

コールバック関数を正しく指定することで、エラーが解消されます。

reduceRightメソッドを使う際は、コールバック関数を忘れずに指定しましょう。

○「arr.reduceRight is not a function」エラー

このエラーは、reduceRightメソッドを配列でないオブジェクトに対して実行しようとした場合に発生します。

const obj = { a: 1, b: 2, c: 3 };
const result = obj.reduceRight((accumulator, currentValue) => {
  return accumulator + currentValue;
});
// TypeError: obj.reduceRight is not a function

エラーメッセージから、objはreduceRightメソッドを持たないオブジェクトであることがわかります。

reduceRightメソッドは配列に対してのみ使用できるメソッドです。

配列でないオブジェクトに対してreduceRightメソッドを使いたい場合は、まずObject.values()などを使ってオブジェクトから値の配列を取得する必要があります。

const obj = { a: 1, b: 2, c: 3 };
const values = Object.values(obj);
const result = values.reduceRight((accumulator, currentValue) => {
  return accumulator + currentValue;
});
console.log(result); // 出力結果: 6

オブジェクトから値の配列を取得してから、その配列に対してreduceRightメソッドを使うことで、エラーが解消されます。

配列でないオブジェクトに対してreduceRightメソッドを使う場合は、まず配列に変換する必要があることを忘れないようにしましょう。

●reduceRightメソッドを使いこなすコツ

これまでreduceRightメソッドの基本的な使い方や応用例、よくあるエラーと対処法について見てきました。

ここからは、reduceRightメソッドを実際に使いこなすためのコツを、サンプルコードを交えて解説していきます。

reduceRightメソッドを効果的に活用するには、初期値の設定とコールバック関数の引数の理解が鍵となります。

これを適切に使いこなすことで、より柔軟で可読性の高いコードを書くことができるでしょう。

○サンプルコード9:初期値を適切に設定する

reduceRightメソッドを使う際、初期値の設定は重要なポイントです。

初期値を適切に設定することで、より簡潔で意図が明確なコードを書くことができます。

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

const sum = numbers.reduceRight((accumulator, currentValue) => accumulator + currentValue);
console.log(sum); // 出力結果: 15

const product = numbers.reduceRight((accumulator, currentValue) => accumulator * currentValue, 1);
console.log(product); // 出力結果: 120

このコードでは、numbersという配列に対してreduceRightメソッドを適用しています。

最初の例では初期値を指定していないため、配列の最後の要素が初期値として使用されます。

一方、2番目の例では初期値に1を指定しているため、accumulator の初期値が1になります。

初期値を指定することで、reduceRightメソッドの動作をより明確に制御できます。

例えば、配列の要素を掛け合わせる場合、初期値を1に設定することで、最終的な結果が期待通りになります。

実行結果は次のようになります。

15
120

初期値の設定は、reduceRightメソッドの用途に応じて適切に行うことが大切です。

単純な足し算や掛け算だけでなく、配列やオブジェクトを扱う場合にも、初期値の設定によってコードの意図がより明確になります。

○サンプルコード10:コールバック関数の引数を理解する

reduceRightメソッドのコールバック関数には、accumulator、currentValue、index、arrayの4つの引数が渡されます。

この引数を適切に使い分けることで、より柔軟でパワフルなコードを書くことができます。

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

const result = numbers.reduceRight((accumulator, currentValue, index, array) => {
  return accumulator + currentValue + index;
}, 0);

console.log(result); // 出力結果: 25

このコードでは、コールバック関数の中で、accumulatorにcurrentValueとindexを足し合わせています。

indexは配列の末尾から数えた要素のインデックスを表します。

実行結果は次のようになります。

25

コールバック関数の引数を活用することで、配列の要素だけでなく、インデックスや配列全体にアクセスできます。

これにより、より複雑な処理を簡潔に記述できます。

例えば、配列の要素とインデックスを組み合わせて計算する場合や、配列全体を参照しながら条件に応じて処理を行う場合など、コールバック関数の引数を有効に活用することで、コードの可読性と柔軟性が向上します。

まとめ

さて、ここまでJavaScriptのreduceRightメソッドについて、基本的な使い方から応用例、エラーへの対処法、そして使いこなすコツまで、様々な角度から詳しく解説してきました。

reduceRightメソッドは、配列の要素を右から左へと処理していくパワフルなメソッドであり、単純な計算だけでなく、配列の変換やフィルタリング、グループ化など、様々な場面で活用できることがわかったと思います。

エラーが発生した際にも、的確に原因を特定し、適切に対処することが大切ですね。

そして、初期値の設定やコールバック関数の引数の理解など、reduceRightメソッドを効果的に使うためのポイントも押さえておきましょう。

この記事で紹介したサンプルコードや使いこなすコツを参考に、実際のコーディングでreduceRightメソッドを積極的に活用してみてください。

きっと、配列処理の幅が広がり、よりスマートで読みやすいコードが書けるようになるはずです。