[TS] オブジェクトの配列をGroup byのように集計してCountでソートする
typescript
javascript
投稿日: 2024/07/17
SQLのGROUP BY & COUNTで重複したレコードの数を取得するようなことをTypeScript(Javascript)で行う。
以下のようなjobs変数があるとする。
const jobs: { tags: string[] }[] = [ { tags: ["出社", "program", "C++"] }, { tags: ["出社", "工事"] }, { tags: ["program", "C++"] }, { tags: ["出社", "C++"] }, { tags: ["program"] }, { tags: ["出社"] }, { tags: ["program"] }, { tags: ["出社"] }, { tags: ["program"] }, { tags: ["出社"] }, ];
tagの文字列ごとに集計してソートするコードをTSで書きたい。
以下のような出力をイメージ。
[ { name: "出社", count: 6 }, { name: "program", count: 5 }, { name: "C++", count: 3 }, { name: "工事", count: 1 } ]
ソースコード
type TagCount = { name: string; count: number }; // タグの出現回数を集計する関数 function countTags(jobs: { tags: string[] }[]): TagCount[] { const tagCounts: { [key: string]: number } = {}; // 各ジョブのタグを集計 jobs.forEach(job => { job.tags.forEach(tag => { if (tagCounts[tag]) { tagCounts[tag]++; } else { tagCounts[tag] = 1; } }); }); // オブジェクトから配列に変換 const result: TagCount[] = Object.keys(tagCounts).map(tag => ({ name: tag, count: tagCounts[tag] })); // 出現回数でソート result.sort((a, b) => b.count - a.count); return result; } // 集計結果を取得 const tagCounts = countTags(jobs); // 出力 console.log(tagCounts);