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

JavaScriptでオブジェクト配列の共通キーの値を合計して1つのオブジェクトにまとめる方法

JavaScriptでは、複数のオブジェクトを含む配列から、キーごとに値を集計したい場面がよくあります。本記事では、オブジェクトの配列内に存在するすべての一意なキーを抽出し、それぞれの値の累積合計を持つオブジェクトを返す関数の実装方法を解説します。

前提となるデータ構造

まず、次のようなオブジェクトの配列を想定します。

const arr = [{a: 2, b: 5, c: 6}, {a:3, b: 4, d:1},{a: 1, d: 2}];

各オブジェクト内部では、同じキーが重複することはありません(それが有効なオブジェクトの条件だからです)。しかし、配列内の異なるオブジェクト同士は、共通のキーを持つことがあります。

実現したいこと

このような配列を受け取り、配列内に出現するすべての一意なキーと、その値の累積合計を値としたオブジェクトを返す関数を作成します。

期待される出力は次のとおりです。

const output = {a: 6, b: 9, c: 6, d: 3};

例えば、キー「a」は各オブジェクトで 2、3、1 という値を持っているため、合計は 6 になります。キーが存在しないオブジェクトについては、単純に計算対象から除外されます。

コード例

この処理を実装したコードは以下のとおりです。

const arr = [{a: 2, b: 5, c: 6}, {a: 3, b: 4, d:1}, {a: 1, d: 2}];
const sumArray = arr => {
    const res = {};
    for(let i = 0; i < arr.length; i++){
        Object.keys(arr[i]).forEach(key => {
            res[key] = (res[key] || 0) + arr[i][key];
        });
    };
    return res;
};
console.log(sumArray(arr));

コードのポイント

  • Object.keys() を使って、各オブジェクトが持つキーを配列として取得します。
  • forEach() で各キーを順番に処理し、結果オブジェクト res に加算していきます。
  • (res[key] || 0) の部分により、そのキーがまだ結果オブジェクトに存在しない場合は 0 を初期値として扱うため、undefined による計算エラーを防げます。

実行結果

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

{ a: 6, b: 9, c: 6, d: 3 }

このように、シンプルなループと Object.keys() を組み合わせるだけで、キーごとの値を効率的に集計できます。また、ES2019以降であれば Object.entries()reduce() を活用しても、同様の処理をより関数的なスタイルで記述することが可能です。

  1. JavaScriptのMap(マップ)オブジェクトとは?基本的な使い方をサンプルコード付きで解説

    MapオブジェクトとはMap(マップ)オブジェクトは、ES6(ECMAScript 2015)で導入された組み込みオブジェクトの一つで、「キー」と「値」のペアで構成される要素を管理するコレクションです。通常のオブジェクトとよく似ていますが、Mapの大きな特徴は、キーにオブジェクトやプリミティブ値など、あらゆる型の値を使用できる点にあります。さらに、要素は挿入した順序で保持されるため、for...ofループなどを利用して、追加した順番どおりに反復処理を行うことも可能です。Mapオブジェクトの主なメソッドとプロパティメソッド / プロパティ説明new Map(iterable)配列などのイテラブル

  2. JavaScriptのBlobオブジェクトとは?基本と使い方をわかりやすく解説

    Blobオブジェクトとは Blob(Binary Large Object)オブジェクトは、不変(イミュータブル)な生データを表現するためのオブジェクトです。Blobはファイルと同じように、データのサイズを表す size プロパティと、MIMEタイプを表す type プロパティを持っています。 File オブジェクトはBlobの派生オブジェクトであるため、Fileが利用できる場面であれば、Blobもそのまま使用することが可能です。 Blobの主な用途としては、テキストやバイナリデータの生成、URL.createObjectURL() を使った一時的なURLの作成、ファイルのダウンロード処理など