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

JavaScriptで配列内の重複キーの値を合計する方法

例えば、次のようなオブジェクトの配列があったとします。

const arr = [ {'TR-01':1}, {'TR-02':3}, {'TR-01':3}, {'TR-02':5}];

ここで求められるのは、このような配列を引数として受け取り、同一のキーに含まれる値をすべて合計してまとめるJavaScript関数です。つまり、重複しているキーごとに値を足し合わせ、1つのオブジェクトに集約する処理を実装します。

したがって、期待される出力は次のようになります。

const output = [ {'TR-01':4}, {'TR-02':8}];

コード例

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

const arr = [ {'TR-01':1}, {'TR-02':3}, {'TR-01':3}, {'TR-02':5}];
const sumDuplicate = arr => {
    const map = {};
    for(let i = 0; i < arr.length; ){
        const key = Object.keys(arr[i])[0];
        if(!map.hasOwnProperty(key)){
            map[key] = i++;
            continue;
        };
        arr[map[key]][key] += arr[i][key];
        arr.splice(i, 1);
    };
};
sumDuplicate(arr);
console.log(arr);

仕組みの解説

この関数は以下の手順で動作します。

  1. まず空のマップ(map)を用意し、各キーが最初に出現した位置のインデックスを記録します。
  2. 初めて見つかったキーの場合は、そのキーと現在のインデックスをマップに登録して次へ進みます。
  3. すでに登録済みのキーだった場合は、元の位置にある要素の値に出現分の値を加算し、splice() を使って重複する要素を配列から削除します。

この処理により、配列自体が破壊的に更新され、同じキーの値がすべて合計されたコンパクトな配列が得られます。

出力結果

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

[ { 'TR-01': 4 }, { 'TR-02': 8 } ]
  1. JavaScriptで配列をreduceする方法|reduce()メソッドで配列要素を合計する

    JavaScriptのreduce()メソッドは、配列の各要素を先頭から順に処理し、その結果を1つの値にまとめる(畳み込む)ための配列メソッドです。数値の合計を求めるだけでなく、配列からオブジェクトを組み立てたり、条件に応じてデータを集約したりと、幅広い場面で活用されています。reduce()メソッドの基本構文 { return 戻り値; }, 初期値);accumulator(アキュムレータ):直前のコールバック関数が返した値(累積値)。最初のループでは初期値、または配列の第1要素が代入されます。currentValue:現在処理している配列の要素。初期値:累積値の出発点となる値。省略し

  2. JavaScriptの+演算子が数値の合計ではなく文字列を連結する原因と対処法

    なぜ「+」演算子は加算ではなく連結を行うのか? JavaScriptで「+」記号を使ったのに、数値の合計ではなく文字列が連結されてしまうのは、parseInt()を使用していないことが主な原因です。 テキストボックス(input要素)から取得した値は、たとえ数字を入力していても、すべて文字列型(string)として扱われます。そのため、そのまま「+」演算子で足し合わせると、数値の加算ではなく文字列同士の連結が実行されてしまいます。 これを解決するには、テキストボックスから値を取得した後、parseInt()を使って文字列を整数に変換(パース)する必要があります。 コード例 以下は、parseI