JavaScriptでオブジェクトの配列を集約!重複データをカウントして整理する方法
問題の概要
例えば、次のようなオブジェクトの配列があったとします。
const arr = [
{
'Country': 'BR',
'New Lv1−Lv2': '#N/A'
},
{
'Country': 'BR',
'New Lv1−Lv2': '#N/A'
},
{
'Country': '',
'New Lv1−Lv2': 'test'
}
];
ここで求められているのは、この配列を受け取り、「Country」プロパティの値が同じオブジェクトを重複とみなして1つにまとめ、重複のない新しい配列を作成して返すJavaScript関数です。
さらに、各オブジェクトに対して、元の配列内で何回出現したかを示す count プロパティを割り当てる必要があります。
実装コード
以下のように実装できます。
const arr = [
{
'Country': 'BR',
'New Lv1−Lv2': '#N/A'
},
{
'Country': 'BR',
'New Lv1−Lv2': '#N/A'
},
{
'Country': '',
'New Lv1−Lv2': 'test'
}
];
const convert = (arr) => {
const res = {};
arr.forEach((obj) => {
const key = `${obj.Country}${obj['New Lv1−Lv2']}`;
if (!res[key]) {
res[key] = { ...obj, count: 0 };
}
res[key].count += 1;
});
return Object.values(res);
};
console.log(convert(arr));
実行結果
コンソールには次のように出力されます。
[
{ Country: 'BR', 'New Lv1-Lv2': '#N/A', count: 2 },
{ Country: '', 'New Lv1-Lv2': 'test', count: 1 }
]
コードのポイント
- 一意なキーの生成: 「Country」と「New Lv1−Lv2」の値を連結した文字列をキーとして使い、同じ組み合わせのデータを1つのグループにまとめています。
- 初回出現時の登録: キーがまだ存在しない場合は、スプレッド構文(
{ ...obj })で元のオブジェクトをコピーし、count: 0を加えて初期化します。 - カウントの更新: 同じキーを持つ要素が出現するたびに
countをインクリメントすることで、出現回数を正確に記録できます。 - オブジェクトから配列への変換: 最後に
Object.values()を使って、集計結果のオブジェクトを配列形式に戻しています。
この手法は、国別・カテゴリ別のデータ集計など、実際のWeb開発でも頻繁に登場するパターンです。仕組みを理解しておくと、APIレスポンスの整形やレポート作成など、さまざまな場面で応用できるので、ぜひ覚えておきましょう。
-
JavaScriptでIDごとにオブジェクトの配列をグループ化する方法
JavaScriptでオブジェクトの配列をidなどの特定のキーごとにグループ化したい場合、reduce()メソッドを使うと簡潔に実装できます。この記事では、どのプロパティにも対応できる汎用的なgroupBy関数を作成し、実際のサンプルコードとともにその仕組みを詳しく解説します。 reduce()によるグループ化の考え方 reduce()は、配列の各要素を順番に処理しながら、1つの累積値(ここではオブジェクト)を組み立てていくメソッドです。各要素からキーの値を取り出し、その値がまだ結果オブジェクトに存在しなければ新しい配列を作成して、そこへ要素を追加していくことでグループ化を実現します。 サ
-
JavaScriptのオブジェクト配列に配列メソッドを適用する方法
JavaScriptでは、オブジェクトが格納された配列に対しても、通常の配列と同じようにpop()、push()、splice()などの標準的な配列メソッドをそのまま使用できます。オブジェクト配列はあくまで「配列」であるため、要素としてオブジェクトが入っていても配列操作のAPIは共通で動作します。 コード例 以下は、JavaScriptオブジェクトの配列に対して配列メソッドを使用するサンプルコードです。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8