JavaScript 如何基于指定键合并数组中的多个对象?
JavaScript实现按指定键合并对象方案
实现思路
- 用
Map作为分组缓存,把FromSize+ToSize的组合值作为唯一分组key - 遍历原数组的每一项,先拼接当前项的分组key:
- 若缓存中不存在该key,就初始化新的分组对象,存入
FromSize和ToSize两个字段 - 往当前分组对象里添加属性,属性名取当前项的
ClearityName值,属性值取对应的Price
- 若缓存中不存在该key,就初始化新的分组对象,存入
- 最后把缓存里的所有值转成数组,就是最终结果
实现代码
function mergeData(data) { const groupMap = new Map() data.forEach(item => { // 拼接唯一分组key const groupKey = `${item.FromSize}_${item.ToSize}` if (!groupMap.has(groupKey)) { // 不存在分组就初始化 groupMap.set(groupKey, { FromSize: item.FromSize, ToSize: item.ToSize }) } // 把ClearityName作为键,Price作为值加入分组对象 const group = groupMap.get(groupKey) group[item.ClearityName] = item.Price }) // 转成数组返回 return Array.from(groupMap.values()) } // 测试调用 var data = [ { FromSize: 54, ToSize: 51, ClearityName: 'IF', Price: 56 }, { FromSize: 54, ToSize: 51, ClearityName: 'VS', Price: 96 }, { FromSize: 54, ToSize: 51, ClearityName: 'VSS', Price: 26 }, { FromSize: 40, ToSize: 30, ClearityName: 'PF', Price: 36 }, { FromSize: 40, ToSize: 30, ClearityName: 'IF', Price: 86 } ] console.log(mergeData(data))
输出结果
和要求的结构完全一致:
[ { FromSize: 54, ToSize: 51, IF: 56, VS: 96, VSS: 26 }, { FromSize: 40, ToSize: 30, PF: 36, IF: 86 } ]
补充说明
如果遇到同分组下ClearityName重复的场景,默认后面的项的Price会覆盖前面的,符合常规的合并逻辑;如果需要保留所有重复值,可以自行修改逻辑将对应值改成数组存储。
内容的提问来源于stack exchange,提问作者Jay Gandhi
相关产品推荐
相关产品推荐

