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

如何合并数组中同标识对象的重复值并聚合差异属性值?

问题描述

给定如下对象数组:

[{
  index:  0,
  name: "name 1",
  key: "key 1",
  value: "value 1"
},
{
  index:  0,
  name: "name 1",
  key: "key 2",
  value: "value 2"
}]

需求是保留重复的index和name值,将同一组(相同index+name)的不同key和value分别聚合为集合,处理后结果如下:

[{
  index:  0,
  name: "name 1",
  key: new Set(["key 1", "key 2"]),
  value: new Set(["value 1", "value 2"])
}]

尝试了以下代码,但会覆盖之前的属性值:

const object = [{index:  0, name: "name 1", key: "key 1", value: "value 1"},
                {index:  0, name: "name 1", key: "key 2", value: "value 2"}]

let new = []
for (let i = 0 ; i < object.length ; i++) {
  if (new.length === 0) {
     new.push({
      index: object[i].index,
      name: object[i].name,
      key: object[i].key,
      value: object[i].value
    })
  } else if (new.length > 0) {
    for (let a = 0 ; a < new.length ; a++) {
      if (new[a].index === object[i].index &&
          new[a].name === object[i].name &&
          new[a].key !== object[i].key) {
            new[a].key = object[i].key
            new[a].value = object[i].value
      }
    }
  }
}
正确实现方式

问题根源

你之前的代码把key和value初始化为单个字符串,后续匹配到同组对象时直接赋值覆盖,没有做集合的追加操作;另外还误用了JS保留关键字new作为变量名,嵌套循环的效率也偏低。

优化实现(使用Map分组)

用Map按index+name的组合作为唯一键分组,每组的key和value初始化为Set(天然支持去重,符合集合需求),遍历原数组时将对应值加入集合即可:

const originalArray = [
  { index: 0, name: "name 1", key: "key 1", value: "value 1" },
  { index: 0, name: "name 1", key: "key 2", value: "value 2" }
];

// 创建Map用于分组,键为index+name的组合字符串
const groupMap = new Map();

for (const item of originalArray) {
  // 生成唯一分组键
  const groupKey = `${item.index}-${item.name}`;
  
  if (!groupMap.has(groupKey)) {
    // 首次遇到该分组,初始化结构,key和value为Set
    groupMap.set(groupKey, {
      index: item.index,
      name: item.name,
      key: new Set([item.key]),
      value: new Set([item.value])
    });
  } else {
    // 已存在该分组,将新的key和value加入集合
    const group = groupMap.get(groupKey);
    group.key.add(item.key);
    group.value.add(item.value);
  }
}

// 将Map的值转为数组,得到最终结果
const aggregatedArray = Array.from(groupMap.values());
console.log(aggregatedArray);

可选调整

如果需要将Set转为普通数组(比如后端要求数组格式),可以修改初始化和追加逻辑:

// 数组版本(带去重判断)
const groupMap = new Map();

for (const item of originalArray) {
  const groupKey = `${item.index}-${item.name}`;
  
  if (!groupMap.has(groupKey)) {
    groupMap.set(groupKey, {
      index: item.index,
      name: item.name,
      key: [item.key],
      value: [item.value]
    });
  } else {
    const group = groupMap.get(groupKey);
    // 避免重复添加相同值
    if (!group.key.includes(item.key)) group.key.push(item.key);
    if (!group.value.includes(item.value)) group.value.push(item.value);
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 08:10:31