JavaScriptでオブジェクト配列内の一意なキーをカウントする方法
はじめに
JavaScriptでは、オブジェクトの配列から特定のプロパティ(キー)がそれぞれ何回出現するかを集計したい場面がよくあります。本記事では、reduce()メソッドを使って、オブジェクト配列内に存在する一意な「ユーザー」ごとの出現回数をカウントする方法を、サンプルコード付きで解説します。
対象となるデータ構造
例として、次のようなオブジェクトの配列を想定します。各オブジェクトはassigned_user(担当ユーザー)とdoc_status(ドキュメントの状態)というプロパティを持っています。
const arr = [
{
assigned_user: {
name: 'Paul',
id: 34158
},
doc_status: "processed"
},
{
assigned_user: {
name: 'Simon',
id: 48569
},
doc_status: "processed"
},
{
assigned_user: {
name: 'Simon',
id: 48569
},
doc_status: "processed"
}
];
実装したい処理の内容
求められているのは、上記のようなオブジェクトの配列を引数として受け取るJavaScript関数です。この関数は、配列内に存在する一意な「ユーザー」プロパティ(assigned_user.name)の出現回数を数え、ユーザー名とそのカウント数をまとめた結果を返します。
実装コード
reduce()メソッドを使えば、配列を一度走査するだけでユーザー名ごとのカウントを効率的に集計できます。コード全体は以下の通りです。
const countUnique = (arr = []) => {
let res = [];
res = arr.reduce(function (r, o) {
let user = o.assigned_user.name;
(r[user]) ? ++r[user] : r[user] = 1;
return r;
}, {}),
result = Object.keys(res).map(function (k) {
return {user: k, count: res[k]};
});
return res;
}
console.log(countUnique(arr));
コードのポイント
- reduce()による集計: 各要素に対してコールバック関数を実行し、初期値として空のオブジェクト
{}を渡しています。これにより、走査しながら結果を累積できます。 - 条件付きカウント:
(r[user]) ? ++r[user] : r[user] = 1;の部分では、すでにそのユーザー名がキーとして存在すればカウントを1増やし、存在しなければ新たに1を設定します。 - 結果の整形:
Object.keys()とmap()を組み合わせることで、集計結果を{user: 名前, count: 回数}形式のオブジェクト配列へ変換することも可能です。
実行結果
コンソールには以下のように出力されます。
{ Paul: 1, Simon: 2 }
Paulは1回、Simonは2回出現していることがわかります。Simonのデータが2件重複していたため、一意なキーごとに正しく集計できていることが確認できます。この手法は、ログデータの集計やドキュメント管理システムでのステータス別カウントなど、さまざまなシーンで応用できる便利なパターンです。
-
JavaScriptのキーイベントとは?keydown・keypress・keyupの違いと使い方を解説
キーイベントとはキーイベント(Key Events)は、ユーザーがキーボードを操作したタイミングで発生するイベントです。JavaScriptでは、主に以下の3種類のキーイベントが用意されています。イベント説明onkeydownユーザーがキーを押し始めた(押している)瞬間に発生します。すべてのキーで検出可能です。onkeypressユーザーがキーを押したときに発生します。ただし、文字を生成しないキー(Shift、Ctrlなど)では発生しないため注意が必要です。onkeyupユーザーが押していたキーを離した瞬間に発生します。それぞれのイベントは発生タイミングが異なるため、用途に応じて使い分けること
-
JavaScriptでEnterキーの押下イベント(keypress)を検出する方法
Webアプリケーションでは、ユーザーがEnterキーを押したタイミングで特定の処理を実行したい場面がよくあります。例えば、検索フォームで入力後に自動で検索を実行したり、チャット画面でメッセージを送信したりするケースです。 JavaScriptでは、onkeypressイベントとEnterキーのキーコード「13」を組み合わせることで、簡単にEnterキーの押下を検出できます。 基本的な実装方法 まず、HTML側のinput要素にonkeypress属性を設定し、キーが押されたときに呼び出す関数を指定します。 onkeypress=yourFunctionName 次に、JavaScript側でイ