You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:54:16