1. ホーム
  2. ジャバスクリプト

[解決済み】オブジェクトの配列をキーでグループ化する方法は?

2022-03-29 03:26:14

質問

オブジェクトの配列をオブジェクトのキーでグループ化し、グループ化に基づいてオブジェクトの新しい配列を作成する方法(可能であればlodashも)を知っている人はいますか?例えば、私は車のオブジェクトの配列を持っています。

const cars = [
    {
        'make': 'audi',
        'model': 'r8',
        'year': '2012'
    }, {
        'make': 'audi',
        'model': 'rs5',
        'year': '2013'
    }, {
        'make': 'ford',
        'model': 'mustang',
        'year': '2012'
    }, {
        'make': 'ford',
        'model': 'fusion',
        'year': '2015'
    }, {
        'make': 'kia',
        'model': 'optima',
        'year': '2012'
    },
];

でグループ化された自動車オブジェクトの配列を新規に作成したい。 make :

const cars = {
    'audi': [
        {
            'model': 'r8',
            'year': '2012'
        }, {
            'model': 'rs5',
            'year': '2013'
        },
    ],

    'ford': [
        {
            'model': 'mustang',
            'year': '2012'
        }, {
            'model': 'fusion',
            'year': '2015'
        }
    ],

    'kia': [
        {
            'model': 'optima',
            'year': '2012'
        }
    ]
}

解決方法は?

ティモの回答 は、私ならこうします。シンプルに _.groupBy そして、グループ化された構造内のオブジェクトにいくつかの重複を許可します。

しかし、OPは、重複する make キーを削除してください。とことんやるなら

var grouped = _.mapValues(_.groupBy(cars, 'make'),
                          clist => clist.map(car => _.omit(car, 'make')));

console.log(grouped);

収量です。

{ audi:
   [ { model: 'r8', year: '2012' },
     { model: 'rs5', year: '2013' } ],
  ford:
   [ { model: 'mustang', year: '2012' },
     { model: 'fusion', year: '2015' } ],
  kia: 
   [ { model: 'optima', year: '2012' } ] 
}

Underscore.jsを使用してこれを行う場合、そのバージョンの _.mapValues というのは _.mapObject .