You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历多维数组,按首个索引聚合求和的实现方案咨询

按时间戳聚合数值的解决方案

嘿,这个需求不难搞定!我帮你准备了两种实用的实现方式,你可以根据数组规模和个人习惯来选择:

方法一:用对象映射实现高效聚合(推荐大数据量场景)

这种方法的核心是用一个对象做“临时映射表”,键存时间戳,值存对应数值的累加和,时间复杂度是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:22:20