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);
代码说明
- 分组逻辑:利用
reduce遍历数组,以id为键构建临时对象,存储每个id对应的合并后对象。 - key合并:判断已有对象的
key类型,字符串则转为数组后添加新值,数组则直接追加,保证多值时为数组格式。 - 格式适配:最后遍历分组结果,将仅含单个值的
key数组转回字符串,与示例输出格式一致。 - class处理:若需求为累加相同
id的class值,取消代码中对应注释即可;若class值在同id下一致,无需额外处理。
内容的提问来源于stack exchange,提问作者Varun
相关产品推荐
相关产品推荐

