zukucode
主にWEB関連の情報を技術メモとして発信しています。

JavaScript オブジェクト配列をsqlのgroup byのように集計する

JavaScriptのオブジェクト配列(jsonも同様)をSQLGROUP BYのように集計します。

具体的には以下のようなことができるようになります。

var arr = [
  {
    name: 'バナナ',
    category: 'フルーツ',
    price: 100
  },
  {
    name: 'りんご',
    category: 'フルーツ',
    price: 120
  },
  {
    name: 'みかん',
    category: 'フルーツ',
    price: 30
  },
  {
    name: 'トマト',
    category: '野菜',
    price: 200
  },
  {
    name: 'キャベツ',
    category: '野菜',
    price: 150
  }
];

// 集計後
// カテゴリーごとの個数(要素数)と金額を集計
[
  {
    category: 'フルーツ',
    count: 3,
    price: 150
  },
  {
    category: '野菜',
    count: 2,
    price: 350
  },
];

実装方法

いろいろとやり方はあるかと思いますが、今回はreduce関数を使用します。

reduce関数の使い方についてはJavaScript reduce関数の基本的な使い方で紹介しています。

var group = arr.reduce(function (result, current) {
  var element = result.find(function (p) {
    return p.category === current.category
  });
  if (element) {
    element.count ++; // count
    element.price += current.price; // sum
  } else {
    result.push({
      category: current.category,
      count: 1,
      price: current.price
    });
  }
  return result;
}, []);

console.log(group);
/* 出力結果
[
  {
    category: 'フルーツ',
    count: 3,
    total: 150
  },
  {
    category: '野菜',
    count: 2,
    price: 350
  },
]
*/

reduce関数は慣れていないとわかりづらいかもしれませんが、使いこなせればとても簡単に配列やオブジェクトを集計できるようになります。

ES2015の表記

アローファンクションやconstを使用するとさらにシンプルになります。

const group = arr.reduce((result, current) => {
  const element = result.find((p) => p.category === current.category);
  if (element) {
    element.count ++; // count
    element.price += current.price; // sum
  } else {
    result.push({
      category: current.category,
      count: 1,
      price: current.price
    });
  }
  return result;
}, []);

IE8以下の対応

IE8以下はreduce関数が使用できません。

下記のURLで紹介されているfunctionを実装すればreduce関数を使用できるようになります。

Array.prototype.reduce() - JavaScript | MDN


関連記事

  • stylelintで例外(無視)するタグを指定する

    cssで構文チェックを行うstylelintで任意のタグを無視してエラーとしない方法を紹介します。以下のようにruleのignoreTypesで無視するタグを指定します。以下の例ではamp htmlの...


  • JavaScript cookieが有効か判定する

    JavaScriptでcookie(クッキー)が有効か判定をします。navigator.cookieEnabledで簡単に判定できます。


  • JavaScript イベントを設定・追加する方法

    JavaScriptでロードイベントやクリックイベントなどのイベントを設定する方法を紹介します。htmlのボタンなどの要素の属性にonclickやonchangeなどのイベントを直接記載する方法です。...


  • JavaScript オブジェクト配列の要素で最大値を取得する

    今回はオブジェクトの配列の場合に要素の最大値・最小値を取得します。オブジェクトの配列があったときに、最大値または最小値を取得します。SQLのGROUP BYで集計するイメージです。第2引数で配列を指定...


  • JavaScript ¥(円マーク)を文字列で扱う

    JavaScriptの¥(円マーク)は、正しく設定していないと利用者のPCのOSなどの環境によっては\(バックスラッシュ)で表示されてしまう可能性があるので、扱いには注意が必要です。JavaS...


  • JavaScript ブラウザがlocalstorageに対応しているか判定する

    ブラウザがlocalstorageに対応しているか判定します。専用のファンクションは用意されていないので、try-catch内の処理で実際にlocalstorageにアクセスしてみて、エラーになれば対...


  • JavaScript 文字列を途中で改行する

    JavaScriptで文字列を途中で改行します。主にalertやconfirmのメッセージで使用します。ブラウザに表示する場合は改行コードをbrタグに置換する必要があります。文字列を改行するには以下の...


  • JavaScript 改行コードなどの特殊文字を文字列として扱う

    改行コードやダブルクォーテーション、シングルクォーテーションなどの特殊文字を文字列として扱うためにはエスケープをする必要があります。特殊文字は基本的には特殊文字の前にバックスラッシュ(`\`)をつける...


  • JavaScript 文字列の長さ(バイト数)を取得する

    JavaScriptで文字列の長さを取得します。バイト数で計算したい場合は以下のようにします。Shift_JISで単純に半角1バイト全角2バイトで計算したい場合は以下のようにします。Shift_JIS...


  • JavaScript 文字列を連結する

    JavaScriptで文字列を連結します。JavaScriptでは文字列の連結は文字列同士を+で結合できます。例えば以下のように、数値同士を+演算子で計算すると足し算が行われてしまうので注意します。上...