如何合并数组中同标识对象的重复值并聚合差异属性值?
问题描述
给定如下对象数组:
[{ 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
相关产品推荐
相关产品推荐

