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

如何在ES6中基于指定键生成含嵌套结构的唯一对象数组

数组分组转换实现方案

需求描述

将包含name、resigned、certificate_number、venue属性的对象数组转换为新数组:新数组中每个对象的name与resigned组合唯一,其余属性以嵌套对象数组形式存入restArr字段。

给定原数组

let arr = [
    {
        name : "jhon",
        resigned : "false",
        certificate_number : "1234556",
        venue : "abc"
    },
    {
        name : "jhon",
        resigned : "false",
        certificate_number : "ABC1234",
        venue : "xyz"
    },
    {
        name : "jhon",
        resigned : "false",
        certificate_number : "111111",
        venue : "lkj"
    },
    {
        name : "George",
        resigned : "false",
        certificate_number : "1234556xyzz",
        venue : "abc"
    },
]

期望结果数组

let result = [
    {
        name : "jhon",
        resigned : "false",
        restArr : [
            {
                certificate_number : "1234556",
                venue : "abc"
            },
            {
                certificate_number : "ABC1234",
                venue : "xyz"
            },
            {
                certificate_number : "111111",
                venue : "lkj"
            }
        ],
    },
    {
        name : "George",
        resigned : "false",
        restArr : [
            {
                certificate_number : "1234556xyzz",
                venue : "abc"
            },
        ],
    }
]

实现代码

const arr = [
    { name: "jhon", resigned: "false", certificate_number: "1234556", venue: "abc" },
    { name: "jhon", resigned: "false", certificate_number: "ABC1234", venue: "xyz" },
    { name: "jhon", resigned: "false", certificate_number: "111111", venue: "lkj" },
    { name: "George", resigned: "false", certificate_number: "1234556xyzz", venue: "abc" },
];

const result = Object.values(arr.reduce((acc, current) => {
    // 生成唯一分组标识key
    const key = `${current.name}-${current.resigned}`;
    // 初始化分组对象(若不存在)
    if (!acc[key]) {
        acc[key] = {
            name: current.name,
            resigned: current.resigned,
            restArr: []
        };
    }
    // 提取非分组属性存入restArr
    acc[key].restArr.push({
        certificate_number: current.certificate_number,
        venue: current.venue
    });
    return acc;
}, {}));

console.log(result);

实现思路

  1. 分组标识:用name和resigned拼接成唯一字符串作为分组key,确保同一组合的对象被归为一组。
  2. 累加器处理:通过reduce遍历原数组,累加器对象存储每个分组的信息,若分组不存在则初始化结构。
  3. 属性提取:每次遍历将当前对象的certificate_number和venue提取出来,推入对应分组的restArr。
  4. 结果转换:最后用Object.values()将累加器的分组对象转换为数组,得到最终结构。

内容的提问来源于stack exchange,提问作者hargun singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:05:19