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

JavaScript实现时间序列数组按小时维度聚合求和

实现方案

你现有的思路方向是对的,优化后可以做到单次遍历完成统计,时间复杂度为O(n),是当前场景下的最优实现,不需要引入额外的日期处理库,直接利用ISO时间的固定格式特性处理即可:

function sumByHour(inputArr) {
  // 取出原数据中的series数组
  const originSeries = inputArr[0].series;
  // 哈希表存储小时维度的累加值
  const hourMap = {};

  originSeries.forEach(item => {
    // 直接按ISO格式固定的'T'分割,拿到时间部分,不需要复杂日期解析
    const timePart = item.category.split('T')[1];
    // 累加值
    hourMap[timePart] = (hourMap[timePart] || 0) + item.value;
  });

  // 转换为目标格式
  const resultSeries = Object.entries(hourMap).map(([category, value]) => ({
    value,
    category
  }));

  // 按小时排序可选,如果需要保证顺序可以加这步
  // resultSeries.sort((a,b) => a.category.localeCompare(b.category))

  return [{ series: resultSeries }];
}

// 调用示例
const input = [
  {
    "series": [
      { "value": 1, "category": "2021-03-04T04:00:00.000" },
      { "value": 2, "category": "2021-03-04T05:00:00.000" },
      { "value": 3, "category": "2021-03-04T06:00:00.000" },
      { "value": 1, "category": "2021-03-05T04:00:00.000" },
      { "value": 2, "category": "2021-03-05T05:00:00.000" },
      { "value": 3, "category": "2021-03-05T06:00:00.000" }
    ]
  }
];
console.log(sumByHour(input));

方案说明

  • 直接利用ISO时间字符串日期T时间的固定结构拆分,比转Date对象、正则匹配的性能高很多,尤其是数据量大的时候差异很明显
  • 用对象做哈希表做累加统计,避免了多次遍历查询重复项的开销
  • 如果需要保证输出结果按小时升序排列,打开注释里的排序逻辑即可,排序开销是O(m log m),其中m最多为24(小时维度总数),几乎可以忽略不计。

内容的提问来源于stack exchange,提问作者codehippy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:36:05