Object.groupBy() は、JavaScriptでオブジェクトをキーに基づいてグループ化するための便利なメソッドです。このメソッドは、配列やその他の反復可能オブジェクト(Iterable)の要素を指定した関数に基づいて分類し、グループごとのキーを持つオブジェクトを生成します。

基本構文
Object.groupBy(iterable, callback)
パラメータ
  1. iterable
    分類対象となる反復可能オブジェクト(配列、ジェネレーター、セットなど)。
  2. callback
    グループ化のためのキーを生成する関数。
    この関数は次の3つの引数を取ります:
    1. element - 現在の要素。
    2. index - 現在の要素のインデックス。
    3. iterable - メソッドが適用される元の反復可能オブジェクト。

戻り値

編集

キーと対応するグループの要素を持つオブジェクト。

使用例

編集

以下は、Object.groupBy() の具体的な使用例です。

配列を数値の奇数と偶数でグループ化する

編集
const numbers = [1, 2, 3, 4, 5, 6];
const grouped = Object.groupBy(numbers, num => (num % 2 === 0 ? 'even' : 'odd'));

console.log(grouped);
// {
//   odd: [1, 3, 5],
//   even: [2, 4, 6]
// }

文字列の長さでグループ化する

編集
const words = ['apple', 'banana', 'cherry', 'date'];
const grouped = Object.groupBy(words, word => word.length);

console.log(grouped);
// {
//   5: ['apple'],
//   6: ['banana', 'cherry'],
//   4: ['date']
// }

ジェネレーターを使ったグループ化

編集

反復可能オブジェクトを扱う例として、ジェネレーターを使ったグループ化を以下に示します。

function* numbers() {
    for (let i = 0; i < 12; i++) {
        yield i;
    }
}

const grouped = Object.groupBy(numbers(), num => (num % 2 === 0 ? 'even' : 'odd'));

console.log(grouped);
// {
//   odd: [1, 3, 5, 7, 9, 11],
//   even: [0, 2, 4, 6, 8, 10]
// }

日付を年ごとにグループ化する

編集
const dates = [
    '2022-01-01',
    '2023-02-01',
    '2022-03-01',
    '2023-04-01'
];
const grouped = Object.groupBy(dates, date => new Date(date).getFullYear());

console.log(grouped);
// {
//   2022: ['2022-01-01', '2022-03-01'],
//   2023: ['2023-02-01', '2023-04-01']
// }

注意点

編集
  1. 配列以外の反復可能オブジェクトもサポート
    Object.groupBy() は配列だけでなく、ジェネレーター、セットなどの反復可能オブジェクト(Iterable)にも対応しています。
  2. キーの一意性
    グループ化のキーは文字列型に変換されるため、キーが重複した場合は上書きされません。
  3. コールバック関数の正確さ
    グループ化のロジックはコールバック関数に依存するため、意図したグループ分けを行うには正確な関数を提供する必要があります。

サポート状況

編集

Object.groupBy() は、最新の JavaScript 標準(ES2024 以降)でサポートされています。使用前にブラウザや環境の互換性を確認してください。

まとめ

編集

Object.groupBy() は、配列や反復可能オブジェクトを効率的にグループ化するための強力なツールです。数値、文字列、日付、ジェネレーターなど、さまざまなデータを分類する際に役立ちます。