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

【JavaScript】除外された平均の計算 – canUseフラグがtrueの要素だけで平均値を求める方法

JavaScriptでは、配列内の一部の要素だけを対象に統計値を求めたいケースがよくあります。本記事では、「特定の条件を満たす要素のみ」を使って平均値を計算する方法(除外された平均の計算)を解説します。

問題設定

まず、次のようなオブジェクトの配列があるとします。各オブジェクトは数値を持つ val プロパティと、真偽値を持つ canUse プロパティを備えています。

const arr = [
    {val: 56, canUse: true},
    {val: 16, canUse: true},
    {val: 45, canUse: true},
    {val: 76, canUse: false},
    {val: 45, canUse: true},
    {val: 23, canUse: false},
    {val: 23, canUse: false},
    {val: 87, canUse: true},
];

ここで求めたいのは、canUse フラグが true に設定されているオブジェクトのみを対象として、その val プロパティの平均値を計算するJavaScript関数です。false のオブジェクトは計算から除外されます。

実装例:forループによる基本的な書き方

以下が実際のコードです。

const arr = [
    {val: 56, canUse: true},
    {val: 16, canUse: true},
    {val: 45, canUse: true},
    {val: 76, canUse: false},
    {val: 45, canUse: true},
    {val: 23, canUse: false},
    {val: 23, canUse: false},
    {val: 87, canUse: true},
];
const excludedAverage = arr => {
    let count = 0, props = 0;
    for(let i = 0; i < arr.length; i++){
       if(!arr[i].canUse){
          continue;
       };
       props++;
       count += arr[i].val;
   };
    return (count) / (!props ? 1 : props);
};
console.log(excludedAverage(arr));

コードの解説

  • count は合計値、props は計算対象となるオブジェクトの個数を記録する変数です。
  • forループで配列を順番に走査し、canUsefalse の要素は continue によってスキップされます。
  • 対象となる要素については、props を1つ増やし、countval の値を加算していきます。
  • 最後に合計値を個数で割って平均を返します。!props ? 1 : props という記述により、対象が1件も存在しない場合でもゼロ除算エラーを防ぎ、0 を返すようになっています。

出力結果

コンソールには次のように表示されます。

49.8

計算対象となるのは 56 + 16 + 45 + 45 + 87 = 249 の5件なので、249 ÷ 5 = 49.8 となり、正しく除外された平均が求められていることがわかります。

別解:filter と reduce を使ったモダンな書き方

ES6以降の配列メソッドを使えば、より宣言的で読みやすいコードにできます。

const excludedAverage = arr => {
    const usable = arr.filter(obj => obj.canUse);
    if (usable.length === 0) return 0;
    const sum = usable.reduce((acc, obj) => acc + obj.val, 0);
    return sum / usable.length;
};
console.log(excludedAverage(arr)); // 49.8
  • filter()canUse === true の要素だけを新しい配列に抽出します。
  • reduce()val の合計を求め、その後要素数で割ります。
  • 対象が空の場合は先にチェックして 0 を返すため、安全に処理できます。

まとめ

条件に合致する要素だけを集計したい場合は、ループ内で continue を使う方法でも、filter()reduce() を組み合わせる方法でも実装可能です。データ量が多くパフォーマンスを重視するなら前者、可読性やメンテナンス性を重視するなら後者がおすすめです。いずれの場合も、ゼロ除算への対策を忘れないようにしましょう。

  1. JavaScriptで配列の中央値を計算する方法をわかりやすく解説

    中央値(メジアン)とは、数値データを小さい順に並べたときにちょうど中央に位置する値のことです。JavaScriptで配列の中央値を求めるには、まず配列をソートし、その後要素数に応じて処理を分けます。要素数が奇数の場合は中央の1つの要素を、偶数の場合は中央に近い2つの要素の平均値を中央値として返します。中央値の計算手順配列をソートする - 数値配列の場合、sort() メソッドに比較関数 (a, b) => a - b を渡して正しく昇順ソートします。中央のインデックスを求める - Math.floor(arr.length / 2) で中央位置を整数として取得します。要素数の判定を行う

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

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