JavaScriptでオブジェクトのコレクションを集約・マージする最良の方法とは?
はじめに
JavaScriptで重複するデータを含むオブジェクトの配列を、1つにまとめて集約したい場面はよくあります。そのような場合に最も効果的なのが、Object.values()とreduce()を組み合わせる方法です。
この記事では、学生IDごとに点数を合計してマージする具体例を通じて、実装方法をわかりやすく解説します。
対象となるデータ
今回は以下のようなオブジェクト配列を例にします。同じstudentIdを持つエントリが複数存在しているのがポイントです。
var details = [
{ studentId: 10, marks: 75, studentName: "John" },
{ studentId: 10, marks: 75, studentName: "John" },
{ studentId: 11, marks: 98, studentName: "Bob" }
];reduce()とObject.values()による集約のコード
reduce()を使ってstudentIdをキーとした中間オブジェクトを作成し、既存のキーがあればmarksの値を加算します。最後にObject.values()で配列形式に変換することで、重複のないマージ済みデータが得られます。
var details = [
{ studentId: 10, marks: 75, studentName: "John" },
{ studentId: 10, marks: 75, studentName: "John" },
{ studentId: 11, marks: 98, studentName: "Bob" }
];
output = Object.values(details.reduce((value, object) => {
if (value[object.studentId]) {
['marks'].forEach(key => value[object.studentId][key] = value[object.studentId][key] + object[key]);
} else {
value[object.studentId] = { ...object };
}
return value;
}, {}));
console.log(output);プログラムの実行方法
上記のプログラムを実行するには、Node.jsを使って以下のコマンドを入力します。ここではファイル名をdemo237.jsとして保存しています。
node demo237.js
実行結果
実行すると、同じstudentIdを持つオブジェクトが1つに統合され、marksの値が合計されていることが確認できます。
PS C:\Users\Amit\javascript-code> node demo237.js
[
{ studentId: 10, marks: 150, studentName: 'John' },
{ studentId: 11, marks: 98, studentName: 'Bob' }
]コードの解説
- reduce()の初期値: 空のオブジェクト
{}を初期値とし、studentIdをキーとして各オブジェクトを格納していきます。 - 重複チェック:
value[object.studentId]がすでに存在する場合は、marksプロパティの値を加算して合計を求めます。 - 新規登録: 存在しない場合は、スプレッド構文
{ ...object }を使ってオブジェクトのコピーを作成し、新しく登録します。 - 配列への変換: 最後に
Object.values()を適用することで、キー付きオブジェクトから値(オブジェクト)だけを取り出した配列を生成します。
まとめ
reduce()でグループ化を行い、Object.values()で結果を配列化する手法は、オブジェクトのコレクションを効率的に集約できる強力なパターンです。forEach内の配列['marks']に対象のキー名を追加すれば、点数以外の数値項目も同時に合計できるため、柔軟に応用できます。データの重複除去や集計処理が必要な際は、ぜひこの方法を活用してみてください。
-
JavaScriptでイベントを追加する最良の方法とは?addEventListener()の使い方を徹底解説
任意の要素にイベントを追加する最良の方法は、addEventListener()メソッドを使用することです。このメソッドは、指定した要素に対してイベントリスナー(イベント発生時に実行される処理)を登録します。従来のonclick属性と異なり、1つの要素に複数のイベントハンドラを追加できるため、現代のWeb開発では標準的な手法とされています。 addEventListener()メソッドの基本構文 element.addEventListener(event, function, useCapture); event: 監視したいイベントの種類(例: 「click」「mouseover」「ke
-
JavaScriptで新しいブラウザウィンドウを開く最良の方法とは?window.open()の使い方を解説
JavaScriptで新しいブラウザウィンドウを開くには、windowオブジェクトのopen()メソッドを使うのが最も標準的で確実な方法です。 window.open()メソッドは、指定したURLを新しいウィンドウ(またはタブ)で開きます。第2引数でウィンドウ名、第3引数でサイズや位置などの表示特性を指定することも可能です。 window.open()の基本構文 window.open(URL, name, features); URL: 開きたいページのアドレス(必須) name: ウィンドウの名前またはターゲット属性(例: _blank)(省略可) features: ウィンドウの幅・高