JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

【JavaScript】配列の最大値・最小値を除外して平均値を求める方法

今回は、数値の配列を受け取り、その中の最大値と最小値を除外した状態での平均値を計算するJavaScript関数を作成します。統計処理やデータ分析において、外れ値の影響を排除したい場合によく使われるテクニックです。

この処理には Array.prototype.reduce() メソッドを使用します。reduce() を活用すれば、配列要素の合計を計算しながら、同時に最大値と最小値も求めることができ、ループを1回で済ませられる効率的な実装になります。

実装例

const arr = [2, 6, 5, 4, 6, 8, 8, 5, 6, 6, 9, 4, 1, 4, 6, 7];
const specialAverage = (arr = []) => {
    const { length } = arr;
    if(length <= 2){
        return 0;
    };
    const { sum, min, max } = arr.reduce((acc, val) => {
        let { min, max, sum } = acc;
        sum += val;
        if(val > max){
            max = val;
        };
        if(val < min){
            min = val;
        };
        return { min, max, sum };
    }, {
        min: Number.MAX_VALUE,
        max: Number.MIN_VALUE,
        sum: 0
    });
    return (sum - min - max) / (length - 2);
};
console.log(specialAverage(arr));

出力結果

上記のコードを実行すると、コンソールに次の出力が表示されます。

5.5

コードの解説

この関数の仕組みを順番に見ていきましょう。

1. 要素数のチェック

まず、配列の長さが2以下の場合は 0 を返しています。最大値と最小値を除外すると計算対象の要素がなくなるため、平均を求められないからです。

2. reduce() による一括処理

初期値として { min: Number.MAX_VALUE, max: Number.MIN_VALUE, sum: 0 } を設定し、各要素に対して以下の処理を行います。

  • 現在の値を合計(sum)に加算する
  • 現在の値がこれまでの最大値より大きければ更新する
  • 現在の値がこれまでの最小値より小さければ更新する

これにより、配列をたどるのは1回だけで、合計・最大値・最小値の3つすべてを取得できます。

3. 平均値の計算

最後に、合計から最大値と最小値を引き、要素数から2を引いた値で割ることで、除外後の平均値 (sum - min - max) / (length - 2) を算出します。

  1. JavaScriptのArray.isArray()メソッドとは?オブジェクトが配列かどうかを判定する方法

    JavaScriptのArray.isArray()メソッドは、指定したオブジェクトが配列であるかどうかを判定するためのメソッドです。判定結果は真偽値として返され、配列であれば true、それ以外の場合は false を返します。typeof 演算子では配列も「object」と判定されてしまうため、正確に配列を見分けたい場面では Array.isArray() が最適な方法となります。基本構文Array.isArray(ob)引数の ob には、判定対象となるオブジェクトを指定します。サンプルコード①:ボタン操作で配列判定を行う <!DOCTYPE html> <html&g

  2. JavaScriptで配列の平均値を計算する方法

    JavaScriptで配列の平均値を求めるには、配列内のすべての要素を合計し、その合計を配列の長さ(要素数)で割ります。要素の合計を求めるには、forEach()メソッドやreduce()メソッドを使うと簡単に実装できます。コード例<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initia