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

JavaScript合并对象数组中重复ID的优化方案需求

JavaScript 合并重复ID对象数组的优化方案

需求说明

给定如下结构的对象数组:

[
  {id:'user1', class: 3, key: 'aaa1'},
  {id:'user2', class: 4, key: 'aaa1'},
  {id:'user1', class: 3, key: 'ccc1'},
  {id:'user3', class: 5, key: 'aaa1'}
]

需要合并具有相同id的条目,最终输出:

[
  {id:'user1', class: 3, key:[ 'aaa1', 'ccc1']},
  {id:'user2', class: 9, key: 'aaa1'},
  {id:'user3', class: 5, key: 'aaa1'}
]

注:user2的class值从4变为9疑似笔误,若需求为累加相同id的class值,可参考代码中的注释调整。

优化实现方案

使用Array.reduce进行分组合并,时间复杂度为O(n),是高效的遍历处理方式:

const input = [
  {id:'user1', class: 3, key: 'aaa1'},
  {id:'user2', class: 4, key: 'aaa1'},
  {id:'user1', class: 3, key: 'ccc1'},
  {id:'user3', class: 5, key: 'aaa1'}
];

// 第一步:按id分组合并key(及class,若需累加)
const grouped = Object.values(input.reduce((acc, curr) => {
  if (acc[curr.id]) {
    // 合并key:统一转为数组存储
    acc[curr.id].key = Array.isArray(acc[curr.id].key) 
      ? [...acc[curr.id].key, curr.key] 
      : [acc[curr.id].key, curr.key];
    // 若需求为累加class值,取消下方注释
    // acc[curr.id].class += curr.class;
  } else {
    // 初始化分组对象,浅拷贝当前元素
    acc[curr.id] = {...curr};
  }
  return acc;
}, {}));

// 第二步:将长度为1的key数组转回字符串,匹配示例格式
const finalResult = grouped.map(item => {
  if (Array.isArray(item.key) && item.key.length === 1) {
    return {...item, key: item.key[0]};
  }
  return item;
});

console.log(finalResult);

代码说明

  1. 分组逻辑:利用reduce遍历数组,以id为键构建临时对象,存储每个id对应的合并后对象。
  2. key合并:判断已有对象的key类型,字符串则转为数组后添加新值,数组则直接追加,保证多值时为数组格式。
  3. 格式适配:最后遍历分组结果,将仅含单个值的key数组转回字符串,与示例输出格式一致。
  4. class处理:若需求为累加相同id的class值,取消代码中对应注释即可;若class值在同id下一致,无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 08:12:21