JavaScriptのreduce()メソッドを使って配列の平均値を求める方法
JavaScriptでは、数値の配列を受け取り、そのすべての要素の平均値を計算する関数が必要になる場面がよくあります。通常であればforループなどで合計を求めてから要素数で割るのが一般的ですが、今回はArray.prototype.reduce()メソッドのみを使用するという条件のもとで実装してみましょう。
reduce()メソッドによる平均値の計算
reduce()メソッドは、配列の各要素に対してコールバック関数(リデューサー)を実行し、単一の結果に集約するための高階関数です。リデューサー関数は以下の4つの引数を受け取ることができます。
- acc(アキュムレータ):前回のコールバック実行時の戻り値(累積値)
- value:現在処理中の配列要素
- index:現在処理中の要素のインデックス番号
- array:対象となっている元の配列
このうちindexとarrayを活用することで、「最後の要素まで加算し終えたタイミングで配列の長さ(length)で割る」という処理を1つのreduce()呼び出しだけで完結させられます。
コード例
const arr = [129, 139, 155, 176];
const calculateAverage = (arr = []) => {
const reducer = (acc, value, index, array) => {
let val = acc + value;
// 最後の要素を処理した時点で平均値を算出する
if (index === array.length - 1) {
return val / array.length;
};
return val;
};
const res = arr.reduce(reducer, 0);
return res;
};
console.log(calculateAverage(arr));実行結果
コンソールには次のように出力されます。
149.75
処理の流れを解説
上記のコードがどのように動作しているのか、ステップごとに見てみましょう。
- 初期値として
0が渡されるため、最初のループではacc = 0、value = 129となり、累積値は129になります。 - 2周目:
129 + 139 = 268 - 3周目:
268 + 155 = 423 - 4周目:最後の要素である
176を加算して599になります。ここでindex === array.length - 1の条件が満たされ、599 / 4 = 149.75という平均値が返されます。
よりシンプルな別解
もし可読性を重視するのであれば、先に合計だけを求めてから除算を行う書き方も有効です。
const calculateAverageSimple = (arr = []) => {
if (arr.length === 0) return 0; // 空配列への安全策
const sum = arr.reduce((acc, value) => acc + value, 0);
return sum / arr.length;
};
console.log(calculateAverageSimple([129, 139, 155, 176])); // 149.75こちらの方法では、リデューサーの役割を「合計の計算」に限定できるため、意図が明確になりバグも発生しにくくなります。また、空の配列が渡された場合にNaNが返るのを防ぐガード節も追加しています。用途やチームのコーディング規約に応じて、適切なスタイルを選択するとよいでしょう。
-
JavaScriptのArray.flatMap()メソッドでネストした配列をフラット化する方法
JavaScriptのArray.flatMap()メソッドは、ネスト(入れ子)された配列に対して各要素に関数を適用した結果を、新しいフラット(平坦化)な配列として返します。map()による変換と、深さ1の配列の平滑化を一度に行える便利なメソッドです。 以下は、Array.flatMap()メソッドの動作を確認できるサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name
-
JavaScriptのArray.flat()メソッドとは?使い方をわかりやすく解説
Array.flat()メソッドの基本JavaScriptのArray.flat()メソッドは、ネストされた(入れ子になった)配列を、指定した深さまで再帰的に平坦化(フラット化)するためのメソッドです。元の配列は変更されず、新しい平坦化された配列が生成される点が特徴です。引数には平坦化の深さ(depth)を数値で指定します。深さを指定しない場合のデフォルト値は「1」です。また、「Infinity」を指定すると、どれほど深くネストされた配列でも完全に平坦化できます。構文arr.flat(depth)depth(省略可能):ネストされた配列を展開する深さ。デフォルトは1。サンプルコード以下は、Ar