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

JavaScriptで配列を四半期・年ごとにグループ化して平均を計算する方法

問題の概要

たとえば、次のような数値の配列があるとします。

const arr = [1,2,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];

この配列を受け取り、3要素ずつの「四半期」グループと12要素ずつの「年」グループに分割したうえで、各グループの平均値を計算して返すJavaScript関数を作成します。

上記の配列を分割すると、グループは次のようになります。

const quarterly = [[1,2,2],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18],[19,20]];
const yearly = [[1,2,2,4,5,6,7,8,9,10,11,12],[13,14,15,16,17,18,19,20]];

実装コード

実際のコードは以下のとおりです。

const arr = [1,2,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];

const findAverages = arr => {
    const quarterLength = 3, yearLength = 12;

    // num個ごとに配列を区切り、各グループの合計を求める
    const sumOfGroup = (arr, num) => {
        return arr.reduce((acc, val, ind) => {
            if (ind % num === 0){
                acc.push(0);
            };
            acc[acc.length - 1] += val;
            return acc;
        }, []);
    };

    const quarters = sumOfGroup(arr, quarterLength);
    const years = sumOfGroup(arr, yearLength);

    return {
        "yearlyAverage": years,
        "quarterlyAverage": quarters
    };
};

console.log(findAverages(arr));

実行結果

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

{
    yearlyAverage: [ 77, 132 ],
    quarterlyAverage: [
        5, 15, 24, 33,
        42, 51, 39
    ]
}

コードの解説

ポイントとなるのは sumOfGroup 関数です。reduce メソッドを使い、インデックスがグループサイズ num の倍数になったタイミングで新しい累積値 0 を追加し、以降は最後のグループへ現在の値を順に加算していきます。

  • quarterLength = 3:3要素ごとに区切り、四半期単位のグループを作成します。
  • yearLength = 12:12要素ごとに区切り、年単位のグループを作成します。
  • 末尾の余りの要素(例:[19, 20])も、そのまま1つのグループとして正しく処理されます。

厳密な平均値を求めたい場合

なお、上記コードが出力しているのは各グループの合計値です。厳密な「平均値」が必要な場合は、各グループの合計をそのグループの要素数で割ります。

const findAverages = arr => {
    const quarterLength = 3, yearLength = 12;

    const avgOfGroup = (arr, num) => {
        return arr.reduce((acc, val, ind) => {
            if (ind % num === 0){
                acc.push({ sum: 0, count: 0 });
            };
            const last = acc[acc.length - 1];
            last.sum += val;
            last.count++;
            return acc;
        }, []).map(g => +(g.sum / g.count).toFixed(2));
    };

    return {
        yearlyAverage: avgOfGroup(arr, yearLength),
        quarterlyAverage: avgOfGroup(arr, quarterLength)
    };
};

console.log(findAverages(arr));
// {
//   yearlyAverage: [ 6.42, 16.5 ],
//   quarterlyAverage: [ 1.67, 5, 8, 11, 14, 17, 19.5 ]
// }

このようにグループ化のロジックを一度用意しておけば、区切りの個数を変えるだけでさまざまな期間単位の集計に対応できます。時系列データや売上データの分析などにぜひ活用してください。

  1. JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説

    JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>

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

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