遍历多维数组,按首个索引聚合求和的实现方案咨询
按时间戳聚合数值的解决方案
嘿,这个需求不难搞定!我帮你准备了两种实用的实现方式,你可以根据数组规模和个人习惯来选择:
方法一:用对象映射实现高效聚合(推荐大数据量场景)
这种方法的核心是用一个对象做“临时映射表”,键存时间戳,值存对应数值的累加和,时间复杂度是O(n),处理大数组时效率更高:
const originalArray = [ [1518739200000, 1], [1518739200000, 1], [1518739200000, 12], [1518739200000, 16], [1518739200000, 16], [1518825600000, 16], [1518825600000, 20], [1518825600000, 20], [1518825600000, 8], ]; // 1. 初始化映射表,存储每个时间戳的累加和 const sumMap = {}; originalArray.forEach(([timestamp, value]) => { // 若时间戳已存在,累加数值;否则初始化 sumMap[timestamp] = (sumMap[timestamp] || 0) + value; }); // 2. 将映射表转换回二维数组格式,并确保时间戳为数字类型 const finalArray = Object.entries(sumMap).map(([ts, sum]) => [Number(ts), sum]); console.log(finalArray); // 输出结果:[[1518739200000, 46], [1518825600000, 64]]
方法二:用reduce直接聚合(代码更简洁)
如果你的数组规模不大,用reduce可以写出更紧凑的代码,逻辑也很直观:
const originalArray = [ [1518739200000, 1], [1518739200000, 1], [1518739200000, 12], [1518739200000, 16], [1518739200000, 16], [1518825600000, 16], [1518825600000, 20], [1518825600000, 20], [1518825600000, 8], ]; const aggregatedArray = originalArray.reduce((acc, [timestamp, value]) => { // 查找当前累加数组中是否已有该时间戳的项 const existingItem = acc.find(item => item[0] === timestamp); if (existingItem) { existingItem[1] += value; } else { acc.push([timestamp, value]); } return acc; }, []); console.log(aggregatedArray); // 输出结果:[[1518739200000, 46], [1518825600000, 64]]
两种方法对比
- 方法一:效率更高,适合处理上万条甚至更大的数据集,因为对象的键查找是O(1)操作;
- 方法二:代码更简洁易读,但
find操作是O(m)(m为已聚合的时间戳数量),当数组非常大时,性能会比方法一差一些。
内容的提问来源于stack exchange,提问作者Steve Frost
相关产品推荐
相关产品推荐

