如何按指定Key对复杂对象数组进行分组?(汽车数据示例)
按
make字段分组复杂对象数组的问题 我的需求和按对象键分组数组的问题类似,但数据结构更复杂,之前的方案不适用。
原始汽车数据
const cars = [ { 'make': 'audi', 'model': ['r8','r9'], 'year': '2012' }, { 'make': 'audi', 'model': ['r8','r9'], 'year': '2013' }, { 'make': 'ford', 'model': ['mustang','mustang lx'], 'year': '2012' }, { 'make': 'ford', 'model': ['mustang','mustang lp'], 'year': '2015' }, { 'make': 'kia', 'model': 'optima', 'year': '2012' }, ];
预期分组结果
希望生成按make字段分组的集合:
{ 'audi': [ { 'make': 'audi', 'model': ['r8','r9'], 'year': '2012' }, { 'make': 'audi', 'model': ['r8','r9'], 'year': '2013' } ], 'ford': [ { 'make': 'ford', 'model': ['mustang','mustang lx'], 'year': '2012' }, { 'make': 'ford', 'model': ['mustang','mustang lp'], 'year': '2015' } ], 'kia': [ { 'make': 'kia', 'model': 'optima', 'year': '2012' } ] }
尝试过的代码
第一段代码
for (let { domain, ...fields } of items) { result[domain] = result[domain] || []; result[domain].push({ ...fields }); }
第二段代码
result = items.reduce(function (r, a) { r[a.domain] = r[a.domain] || []; r[a.domain].push(a); return r; }, Object.create(null));
实际输出结果
{ 'audi': [ { 'make': 'audi', 'model': [Array], 'year': '2012' }, { 'make': 'audi', 'model': [Array], 'year': '2013' } ], 'ford': [ { 'make': 'ford', 'model': [Array], 'year': '2012' }, { 'make': 'ford', 'model': [Array], 'year': '2015' } ], 'kia': [ { 'make': 'kia', 'model': 'optima', 'year': '2012' } ] }
注:尝试的代码中误用了
domain字段,实际需分组的字段为make;输出中model显示为[Array]是控制台简化显示,可通过JSON.stringify查看完整内容。
正确解决方案
把代码里的domain替换成make就能得到预期结果,以下是修正后的两种写法:
修正后的循环写法
const result = {}; for (let { make, ...fields } of cars) { result[make] = result[make] || []; result[make].push({ make, ...fields }); }
修正后的reduce写法
const result = cars.reduce(function (r, a) { r[a.make] = r[a.make] || []; r[a.make].push(a); return r; }, Object.create(null));
运行修正后的代码后,就能得到想要的分组结果。如果需要查看完整的数组内容,用console.log(JSON.stringify(result, null, 2))输出即可。
内容的提问来源于stack exchange,提问作者Barry MSIH
相关产品推荐
相关产品推荐

