如何按键对一组对象进行分组?

新手上路,请多包涵

有谁知道一种方法(如果可能的话,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'
        }
    ]
}

原文由 Trung Tran 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 588
2 个回答

蒂莫的回答 是我会怎么做。简单 _.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

原文由 Jonathan Eunice 发布,翻译遵循 CC BY-SA 4.0 许可协议

在纯 Javascript 中,您可以将 Array#reduce 与对象一起使用

 var 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' }],
    result = cars.reduce(function (r, a) {
        r[a.make] = r[a.make] || [];
        r[a.make].push(a);
        return r;
    }, Object.create(null));

console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

原文由 Nina Scholz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题