
本文介绍如何在 JavaScript 中对多个长度不一、但共享时间戳的时间序列数组进行聚合,按统一时间点合并所有可用数值并计算均值,最终输出标准 [timestamp, averageValue] 格式数组。
本文介绍如何在 javascript 中对多个长度不一、但共享时间戳的时间序列数组进行聚合,按统一时间点合并所有可用数值并计算均值,最终输出标准 `[timestamp, averagevalue]` 格式数组。
在时序数据分析场景中(如传感器数据、日志指标或金融行情),常遇到多源数据缺失不一致的问题:各数据流采样频率相近,但因网络延迟、设备离线或写入失败导致部分时间点缺失。此时,若需生成一条“融合均值曲线”,核心挑战在于——跳过缺失值、对齐有效时间戳、跨数组聚合计算。本文提供一种不依赖外部库(如 Lodash)的现代 JavaScript 解决方案,兼顾可读性、性能与健壮性。
核心思路:分三步完成聚合
- 扁平化合并:将所有时间序列数组展开为单一二维数组;
- 按键分组:以时间戳为 key,收集所有对应数值构成数组;
- 映射计算:遍历分组结果,对每个时间戳下的数值数组求算术平均,并格式化输出。
实现代码(ES2020+)
const array1 = [[1, 100], [2, 200], [3, 300], [4, 400]];
const array2 = [[1, 150], [3, 350], [4, 450]];
const array3 = [[1, 250], [2, 350], [4, 450]];
const allArrays = [array1, array2, array3];
// 步骤 1 & 2:扁平化 + 按时间戳分组(使用 nullish coalescing assignment ??=)
const groupedByTime = allArrays
.flat() // 替代 [...array1, ...array2, ...array3],更简洁且支持任意数量数组
.reduce((acc, [time, value]) => {
(acc[time] ??= []).push(value);
return acc;
}, {});
// 步骤 3:转为结果数组,计算均值并保留一位小数
const averagedResult = Object.entries(groupedByTime)
.map(([timeStr, values]) => {
const time = Number(timeStr);
const avg = values.reduce((sum, v) => sum + v, 0) / values.length;
return [time, parseFloat(avg.toFixed(1))]; // toFixed(1) → string,用 parseFloat 转回 number 更稳妥
})
.sort((a, b) => a[0] - b[0]); // 确保按时间升序排列(原始数据未必有序)
console.log(averagedResult);
// 输出: [[1, 166.7], [2, 275], [3, 325], [4, 433.3]]关键细节说明
- ✅ Array.prototype.flat():替代手动展开,天然支持嵌套层级控制(默认深度 1),语义清晰且兼容性良好(Node.js ≥12,现代浏览器全覆盖);
- ✅ ??= 运算符:仅当 acc[time] 为 null 或 undefined 时才初始化为空数组,避免覆盖已有值,比 ||= 更安全(防止 0、false 等 falsy 值误判);
- ✅ parseFloat(avg.toFixed(1)):相比直接返回字符串,确保结果为数值类型,便于后续数学运算或图表库消费;
- ✅ 显式排序:Object.entries() 不保证插入顺序,尤其当时间戳非连续或含负数时,sort() 可确保输出严格按时间递增,符合时间序列惯例。
注意事项与扩展建议
- 精度处理:若业务要求更高精度(如金融场景),应避免 toFixed() 的字符串截断,改用 Math.round(avg * 10) / 10 保持数值类型;
- 空数组防护:生产环境建议增加 if (values.length === 0) return; 防御性检查(本例中不会触发,但增强鲁棒性);
- 大规模数据优化:当数组总量超万级时,可考虑使用 Map 替代普通对象(new Map() + map.get(t)?.push(v) || map.set(t, [v])),避免原型链查找开销;
- 支持毫秒级时间戳:代码完全兼容 Unix 毫秒时间戳(如 Date.now()),无需额外转换。
该方案轻量、无依赖、逻辑直白,适用于前端可视化预处理或 Node.js 后端数据聚合,是处理异构时间序列均值融合的推荐实践。









