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

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

はじめに

この記事では、数値の配列を受け取り、その中から最小値と最大値を除外した残りの要素の平均値を返すJavaScript関数の作り方を解説します。統計処理やテストのスコア計算など、外れ値の影響を避けたいトリム平均(刈り込み平均)を求めたい場面で役立つテクニックです。

実装の考え方

最も効率的なのは、配列を一度だけ走査しながら「合計値」「最小値」「最大値」を同時に記録していく方法です。reduce()メソッドを使えば、以下の手順でまとめて処理できます。

  1. 初期値として、合計(sum)は 0、最小値(min)は Infinity、最大値(max)は -Infinity を設定する。
  2. 各要素を順に処理し、合計に加算するとともに、必要に応じて min と max を更新する。
  3. 最後に、合計から min と max を引き、要素数から 2 を引いた値で割って平均を求める。

サンプルコード

const arr = [1, 4, 5, 3, 5, 6, 12, 5, 65, 3, 2, 65, 9];

const findExcludedAverage = arr => {
  const creds = 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: Infinity,
    max: -Infinity,
    sum: 0
  });
  const { max, min, sum } = creds;
  // 合計から最小値と最大値を引き、残りの要素数で割る
  return (sum - min - max) / (arr.length - 2);
};

console.log(findExcludedAverage(arr));

実行結果

10.818181818181818

コードのポイント

  • reduce()で一括処理できる: ループを一回回すだけで合計・最小・最大を同時に取得でき、計算量は O(n) で済みます。
  • Infinityを初期値に使う理由: どのような数値が来ても最初の比較で必ず更新されるため、安全な初期化になります。
  • 割る数は「要素数 − 2」が正解: 最小値と最大値の2つの要素を除外しているため、平均の分母もそれに合わせて 2 を引く必要があります。ここを誤ると正しい平均にならないので注意しましょう。

別解:sort()を使うシンプルな方法

配列を昇順にソートし、両端の1つずつを取り除いてから平均を取る方法もあります。コードは短く読みやすくなりますが、ソートには O(n log n) の計算量がかかるため、要素数の多い配列では前述の reduce() 方式が有利です。

const findExcludedAverage = arr => {
  const sorted = [...arr].sort((a, b) => a - b);
  const trimmed = sorted.slice(1, sorted.length - 1);
  return trimmed.reduce((a, b) => a + b, 0) / trimmed.length;
};

console.log(findExcludedAverage([1, 4, 5, 3, 5, 6, 12, 5, 65, 3, 2, 65, 9]));

なお、[...arr]でスプレッド構文によるコピーを行っているのは、元の配列がsort()によって破壊的に変更されるのを防ぐためです。

まとめ

最小値と最大値を除外した平均を求める場合は、reduce()で合計・最小・最大を一括取得する方法が最も効率的です。分母を「要素数 − 2」にすることを忘れなければ、外れ値の影響を抑えた正確な平均値が得られます。データ分析や成績処理など、さまざまな場面で応用できるので、ぜひ覚えておきましょう。

  1. C++で配列内の最小値と2番目に小さい値を検索する方法

    n個の要素からなる配列が与えられたとき、その中で最も小さい要素(最小値)と、2番目に小さい要素を見つける必要があります。ここでいう「2番目に小さい要素」とは、最小値より大きい値の中で最小のものを指します。この問題は、配列の各要素を先頭から順に走査しながら、現時点での最小値と2番目に小さい値を適切に更新していくことで解決できます。アルゴリズムの考え方まず、最小値(first)と2番目に小さい値(sec)を、それぞれ int 型の最大値 INT_MAX で初期化します。次に配列を一巡するループの中で、以下の条件に従って値を更新していきます。現在の要素が最小値より小さい場合:2番目に小さい値を元の最

  2. C#で配列の全要素の平均値を求める方法

    C#で配列内のすべての要素の平均値を求めるには、まず対象となる配列を用意します。1. 配列の準備ここでは、10個の整数要素を持つ配列を例に説明します。int[] myArr = new int[10] { 45, 23, 55, 15, 8, 4, 2, 5, 9, 14 };2. 平均値の計算方法平均値を求める基本的な手順は以下のとおりです。 配列の長さ(要素数)を Length プロパティで取得する ループ処理ですべての要素の合計値を計算する 合計値を要素数で割って平均値を求める int len = myArr