この記事では、TypeScriptで配列内のオブジェクトをグループ分けする方法をお伝えします。
少しでも実装方法で悩んでいる方の参考になれば幸いです。
Sponsored Link
TypeScriptで配列内のオブジェクトをグループ分けする方法
結論から言うと、TypeScriptで配列内のオブジェクトをグループ分けするには、以下のコードを実装します。
export const group = <T>(values: T[], key: keyof T) => {
return values.reduce((prev, current) => {
const keyValue = String(current[key]);
(prev[keyValue] || (prev[keyValue] = [])).push(current);
return prev;
}, {} as Record<string, T[]>);
};
以下がコードの説明です。
export const group = <T>(values: T[], key: keyof T) => {:groupという名前の関数をエクスポートし、ジェネリクス<T>を使って型パラメータTを定義します。これは、関数が異なる型の配列を処理できるようにするためのものです。- 関数は、
valuesとkeyという2つの引数を受け取ります。valuesはグループ化する対象の配列であり、keyはグループ化の基準となるオブジェクトのプロパティ名です。
return values.reduce((prev, current) => {:reduceメソッドを使用して、values配列を走査しながら新しいオブジェクトを構築します。prevは現在の累積オブジェクト、currentは現在処理中の要素を表します。
const keyValue = String(current[key]);:- 現在の要素から指定されたキー(
key)にアクセスし、その値を文字列に変換してkeyValueに格納します。この値は、グループのキーとして使用されます。
- 現在の要素から指定されたキー(
(prev[keyValue] || (prev[keyValue] = [])).push(current);:- 現在の要素を
keyValueに基づいてグループ化します。これは、オブジェクトprev内のkeyValueプロパティを取得し、存在しない場合は新しい空の配列([])を代入します。 - その後、現在の要素(
current)をこの配列に追加します。
- 現在の要素を
return prev;:reduceメソッドの各ステップで更新されたprevオブジェクトを返します。このオブジェクトには、指定されたキーに基づいてグループ化された要素が含まれています。
}, {} as Record<string, T[]>);:reduceメソッドの初期値として空のオブジェクト({})を使用します。これは、グループ化の結果を格納するための初期状態を提供します。- 型アサーション (
as Record<string, T[]>) を使用して、オブジェクトの型を明示的に指定しています。このオブジェクトは、文字列型のキーとT型の配列値を持つことを示しています。
これを使用して、以下のようなデータ(users)をグループ分けしてみます。
type User = {
id: number;
name: string;
group: "A" | "B" | "C";
};
const users: User[] = [
{ id: 1, name: "jiro", group: "A" },
{ id: 2, name: "hana", group: "B" },
{ id: 3, name: "keita", group: "C" },
{ id: 4, name: "yuta", group: "B" },
{ id: 5, name: "ai", group: "C" },
{ id: 6, name: "sakura", group: "B" },
];
このデータに対して先ほどのgroup関数を呼び出します。
const result = group(users, "group");
すると、以下のようにグループ分けできます。
const result = {
A: [{ id: 1, name: "jiro", group: "A" }],
B: [
{ id: 2, name: "hana", group: "B" },
{ id: 4, name: "yuta", group: "B" },
{ id: 6, name: "sakura", group: "B" },
],
C: [
{ id: 3, name: "keita", group: "C" },
{ id: 5, name: "ai", group: "C" },
],
};
以上が、TypeScriptで配列内のオブジェクトをグループ分けする方法です。
もちろん、他の方法でもグループ分けを実現することはできます。あくまで一例と捉えていただけると嬉しいです。
TypeScriptで配列内のオブジェクトをグループ分けする方法 おわりに
今回は、TypeScriptで配列内のオブジェクトをグループ分けする方法を解説しました。
TypeScriptでは、以下のコードを使うことで、配列内のオブジェクトをグループ分けすることができます。
export const group = <T>(values: T[], key: keyof T) => {
return values.reduce((prev, current) => {
const keyValue = String(current[key]);
(prev[keyValue] || (prev[keyValue] = [])).push(current);
return prev;
}, {} as Record<string, T[]>);
};
最後まで読んでいただきありがとうございました。

