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
相关产品推荐
相关产品推荐

