JavaScript合并含重复项的对象数组(保留多sw_version值)
解决方法
要保留同一timestamp下的多个sw_version条目,同时合并其他唯一指标,我们可以先按timestamp分组处理数据,再根据分组内的sw_version数量生成对应条目:
实现代码
const available = [ {"timestamp": 10,"sw_version": "AA"}, {"timestamp": 10,"sw_version": "AB"}, {"timestamp": 20,"sw_version": "QFX-1.2.5 B"}, {"timestamp": 10,"pressure": 14.75}, {"timestamp": 20,"pressure": 14.22}, {"timestamp": 10,"temperature": 15.96}, {"timestamp": 20,"temperature": 38.50}, {"timestamp": 30,"temperature": 2.2}, {"timestamp": 30,"pressure": 9.8} ]; // 第一步:按timestamp分组,收集sw_version和其他指标 const grouped = available.reduce((groups, item) => { const ts = item.timestamp; if (!groups[ts]) { groups[ts] = { swVersions: [], metrics: {} }; } if ('sw_version' in item) { groups[ts].swVersions.push(item.sw_version); } else { // 其他指标直接合并,因为同一timestamp唯一 Object.assign(groups[ts].metrics, item); } return groups; }, {}); // 第二步:根据分组生成最终结果 const desired = Object.entries(grouped).flatMap(([ts, data]) => { const base = { timestamp: Number(ts), ...data.metrics }; // 如果有sw_version,每个版本生成一个条目;没有则直接返回基础条目 return data.swVersions.length ? data.swVersions.map(v => ({ ...base, sw_version: v })) : [base]; }); console.log(desired);
输出结果
[ {"timestamp":10,"pressure":14.75,"temperature":15.96,"sw_version":"AA"}, {"timestamp":10,"pressure":14.75,"temperature":15.96,"sw_version":"AB"}, {"timestamp":20,"pressure":14.22,"temperature":38.5,"sw_version":"QFX-1.2.5 B"}, {"timestamp":30,"temperature":2.2,"pressure":9.8} ]
核心逻辑
- 分组处理:先用
reduce按timestamp把数据分成两组——swVersions收集当前时间戳下的所有版本号,metrics合并其他唯一指标(压力、温度等)。 - 生成结果:遍历每个分组,若有版本号则为每个版本生成带完整指标的条目;若无版本号则直接返回合并后的指标条目,确保同一
timestamp下的多个sw_version都被保留。
内容的提问来源于stack exchange,提问作者shamikh
相关产品推荐
相关产品推荐

