JavaScriptで配列内の重複オブジェクトをマージしてカウントを集計する方法
次のような、オブジェクトを要素にもつ配列があったとしましょう。
const arr = [
{code: "AA", gender:"male", DOB:"2000-05-15"},
{code: "AA", gender:"female", DOB:"2015-05-15"},
{code:"A0", gender:"female", DOB:"2005-01-01"},
{code: "A1", gender:"male", DOB:"2015-01-15"}
];このような配列を受け取り、「code」プロパティの値をもとに重複しているオブジェクトをグループ化して件数を数え、一意なオブジェクトごとに新しい「count」プロパティを割り当てるJavaScript関数を作成する必要があります。
さらに、各オブジェクトには「child」プロパティも割り当てます。この値は、「DOB」(生年月日)と現在の日付から計算した年齢が18歳未満であれば1、そうでなければ0となります。
実装コード例
実際のコードは以下の通りです。
const arr = [
{code: "AA", gender:"male", DOB:"2000-05-15"},
{code: "AA", gender:"female", DOB:"2015-05-15"},
{code:"A0", gender:"female", DOB:"2005-01-01"},
{code: "A1", gender:"male", DOB:"2015-01-15"}
];
const groupAndAdd = (arr = []) => {
const result = new Map();
let nowYear = new Date().getYear();
arr.forEach(el => {
let item = result.get(el.code) || {code: el.code, count: 0, female: 0, child: 0 };
item.count++;
item.female += el.gender === "female";
item.child += nowYear − new Date(Date.parse(el.DOB)).getYear() <18;
result.set(item.code, item);
});
return result;
};
console.log(groupAndAdd(arr));出力結果
コンソールには以下のように出力されます。
Map {
'AA' => { code: 'AA', count: 2, female: 1, child: 1 },
'A0' => { code: 'A0', count: 1, female: 1, child: 1 },
'A1' => { code: 'A1', count: 1, female: 0, child: 1 }
}コードの解説
この実装では、キーと値のペアを効率的に管理できるMapオブジェクトを使用しています。処理の流れは以下の通りです。
まず、「code」の値をキーとしてMapに登録していきます。result.get(el.code)で既存のエントリを取得し、存在しない場合は初期値を持つ新しいオブジェクトを生成します。
次に、同じ「code」が見つかるたびにcountをインクリメントします。「gender」が"female"である場合、比較演算の結果trueが返され、加算時に数値の1として扱われるため、女性の人数が自動的にカウントされます。
年齢の判定については、現在の年と生年月日から算出した誕生年の差分が18未満かどうかを評価しています。ここでgetYear()メソッドを使うことで、現在日時と生年月日の両方を同じ基準(1900年からの経過年数)で比較でき、正確な年齢判定が可能になっています。条件が真の場合はtrueが1として加算され、偽の場合は0が加算されます。
このように、Mapによるグループ化と論理値の数値変換を組み合わせることで、重複のマージと複数条件の集計を簡潔に実装できます。同様の手法は、アンケート結果の集計やログデータの統計処理など、さまざまな場面で応用できます。
-
【JavaScript入門】複数のオブジェクトを1つにマージして単一のオブジェクト配列を作成する方法
JavaScriptでは、Object.assign()メソッドとスプレッド構文(...)を組み合わせることで、配列内の複数のオブジェクトを1つのオブジェクトに簡単にマージすることができます。 Object.assign()は、1つ以上のコピー元オブジェクトから、コピー先のオブジェクトへすべてのプロパティをコピーするためのメソッドです。スプレッド構文を使って配列の要素を展開することで、各オブジェクトのキーと値が1つのオブジェクトに統合されます。 コード例 以下のコードは、配列内の複数のオブジェクトを単一のオブジェクトにマージする例です。 <!DOCTYPE html> <ht
-
【JavaScript入門】Symbolを使ってオブジェクトごとに一意のIDを作成する方法
はじめにJavaScriptでオブジェクトごとに一意のIDを作成したい場合、Symbol()を使うのが最も簡単かつ確実な方法です。Symbolは呼び出されるたびに必ず新しい一意の値を生成するため、たとえ同じ説明文字列を渡しても、二度と同じ値にはなりません。以下は、各オブジェクトに対して一意のIDを作成するサンプルコードです。実装例<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewp