如何按需求聚合JSON数据?(JavaScript实现)
问题解决:API响应数据聚合处理
原始API响应数据
[ { sumTime: "2024-04-25 12:00:00", equipParaName: "P1", sumValue: 5 }, { sumTime: "2024-04-25 05:00:00", equipParaName: "P2", sumValue: 10 }, { sumTime: "2024-04-25 09:00:00", equipParaName: "P1", sumValue: 8 }, { sumTime: "2024-04-25 08:00:00", equipParaName: "P2", sumValue: 3 }, { sumTime: "2024-04-25 08:00:00", equipParaName: "P3", sumValue: 12 } ]
聚合规则
- 同一
sumTime下,equipParaName不可重复(原始数据已满足该条件) - 结果中单个对象最多包含所有唯一
equipParaName对应的属性(本例为P1、P2、P3) - 同一
equipParaName的数据需按sumTime升序排列,依次填入结果列表的对应位置(时间早的在前序对象)
期望输出
[ { index: 1, P1: 8, P1_sumTime: "2024-04-25 09:00:00", P2: 10, P2_sumTime: "2024-04-25 05:00:00", P3: 12, P3_sumTime: "2024-04-25 08:00:00" }, { index: 2, P1: 5, P1_sumTime: "2024-04-25 12:00:00", P2: 3, P2_sumTime: "2024-04-25 08:00:00" } ]
JavaScript实现代码
function aggregateData(rawData) { // 按equipParaName分组,并对每组按sumTime升序排序 const grouped = rawData.reduce((acc, item) => { if (!acc[item.equipParaName]) { acc[item.equipParaName] = []; } acc[item.equipParaName].push(item); return acc; }, {}); // 对每个分组按时间升序排序 Object.values(grouped).forEach(group => { group.sort((a, b) => new Date(a.sumTime) - new Date(b.sumTime)); }); // 确定结果数组的长度(取最长分组的条目数) const maxLength = Math.max(...Object.values(grouped).map(g => g.length)); // 构建最终结果数组 const result = []; for (let i = 0; i < maxLength; i++) { const obj = { index: i + 1 }; // 遍历每个参数名,填充对应位置的数据 Object.entries(grouped).forEach(([paraName, items]) => { const item = items[i]; if (item) { obj[paraName] = item.sumValue; obj[`${paraName}_sumTime`] = item.sumTime; } }); result.push(obj); } return result; } // 测试调用 const rawData = [ { sumTime: "2024-04-25 12:00:00", equipParaName: "P1", sumValue: 5 }, { sumTime: "2024-04-25 05:00:00", equipParaName: "P2", sumValue: 10 }, { sumTime: "2024-04-25 09:00:00", equipParaName: "P1", sumValue: 8 }, { sumTime: "2024-04-25 08:00:00", equipParaName: "P2", sumValue: 3 }, { sumTime: "2024-04-25 08:00:00", equipParaName: "P3", sumValue: 12 } ]; console.log(JSON.stringify(aggregateData(rawData), null, 2));
内容的提问来源于stack exchange,提问作者Sao Bui Van
相关产品推荐
相关产品推荐

