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

如何将数组中数值相同的对象进行分组合并?

如何按value分组合并对象数组?

我有如下对象数组:

arrayOfObjects = [
    {
        "name": "OneFullValue",
        "value": 709
    },
    {
        "name": "DRTG",
        "value": 0
    },
    {
        "name": "OtherFullValue",
        "value": 345
    },
    {
        "name": "TYU",
        "value": 0
    },
    {
        "name": "TRHY",
        "value": 0
    },
    {
        "name": "UOI",
        "value": 0
    },
]

想要得到的目标结果:

arrayOfObjectsEndGoal = [
    {
        "name": "OneFullValue",
        "value": 709
    },
    {
        "name": "DRTG - TYU - TRHY - UOI",
        "value": 0
    },
    {
        "name": "OtherFullValue",
        "value": 345
    }
]

核心需求:将所有value值相同的对象分组,合并后的对象name为对应所有对象的name以-连接的字符串,value保留原数值,不会因为分组数量改变。

比如当数组中value为123的对象有多个时,处理结果如下:

原始数组:

arrayOfObjects = [
    {
        "name": "OneFullValue",
        "value": 709
    },
    {
        "name": "DRTG",
        "value": 123
    },
    {
        "name": "OtherFullValue",
        "value": 345
    },
    {
        "name": "TYU",
        "value": 123
    },
    {
        "name": "TRHY",
        "value": 123
    },
    {
        "name": "UOI",
        "value": 123
    },
]

目标结果:

arrayOfObjectsEndGoal = [
    {
        "name": "OneFullValue",
        "value": 709
    },
    {
        "name": "DRTG - TYU - TRHY - UOI",
        "value": 123
    },
    {
        "name": "OtherFullValue",
        "value": 345
    }
]

我已经尝试过两种方式:

  • 用reduce合并所有对象:
arrayOfObjects.reduce(
    ((prev, oth) => Object.assign(prev, oth)), {}
)
  • 用forEach遍历操作,但逻辑没理清:
let objItem = {};
let arrayOfObjectsEndGoal = [];

arrayOfObjects.foreach((obj) => {
  if (objItem[obj.value]) {
    let first = objItem[obj.name] -1;
    let newValue = {
      ...arrayOfObjectsEndGoal[first]
    };

    arrayOfObjectsEndGoal[first] = newValue;
});

但不知道怎么进一步实现目标效果,请问该如何完成这类对象的合并?


解决方案

可以借助reduce先按value分组,再将分组后的结构转换为目标数组:

const mergedArray = Object.values(
  arrayOfObjects.reduce((acc, curr) => {
    // 以value作为分组键
    const key = curr.value;
    if (!acc[key]) {
      // 首次遇到该value时,初始化分组
      acc[key] = { name: curr.name, value: curr.value };
    } else {
      // 已有分组时,拼接name
      acc[key].name += ` - ${curr.name}`;
    }
    return acc;
  }, {})
);

代码解释:

  1. reduce分组:遍历原数组,用每个对象的value作为键,将同value的对象归到同一分组中;
  2. 初始化分组:如果当前value对应的分组不存在,直接将当前对象作为分组的初始值;
  3. 拼接name:如果分组已存在,就把当前对象的name用-连接到分组对象的name上;
  4. 转换为数组:用Object.values()提取分组后的对象值,得到最终的合并数组。

这个方法能处理任意数字的value,完全符合需求,而且逻辑清晰、效率较高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:50:36