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

如何在JS中高效合并时间戳不匹配的多组时间序列数组?

多时间序列非对齐合并高效方案

方案选型说明

针对单数组已按时间戳升序排列、时间轴非完全对齐的合并场景,有两种高性能实现方案:

  • 哈希映射法:代码实现极简,适合中小数据量(总数据点<100万),时间复杂度O(N),N为所有数组的总数据点数
  • 多指针归并法:无额外哈希、排序开销,内存占用更低,适合超大规模数据量,时间复杂度同样O(N)

方案1:哈希映射实现(推荐大部分场景使用)

实现逻辑:遍历所有数组,以时间戳为键存储对应位置的数值,最后将所有时间戳升序排序后转成结果数组即可。

function mergeTimeSeries(arrays) {
  const tsMap = new Map();
  const arrayCount = arrays.length;

  // 遍历所有数组填充映射表
  for (let arrIndex = 0; arrIndex < arrayCount; arrIndex++) {
    const currentArr = arrays[arrIndex];
    for (const [timestamp, value] of currentArr) {
      if (!tsMap.has(timestamp)) {
        tsMap.set(timestamp, new Array(arrayCount).fill(null));
      }
      tsMap.get(timestamp)[arrIndex] = value;
    }
  }

  // 按时间戳升序输出结果
  return Array.from(tsMap.entries())
    .sort((a, b) => a[0] - b[0])
    .map(([timestamp, values]) => [timestamp, ...values]);
}

// 测试示例
const arr1 = [
  [1637837518000, 1.7],
  [1637837519000, 0.1],
  [1637837520000, 1.3],
  [1637837521000, 6.4],
  [1637837522000, 2.2],
  [1637837523000, 2.1]
];
const arr2 = [
  [1637837517000, 600.32],
  [1637837520000, 578.98],
  [1637837523000, 612.76]
];
const arr3 = [
  [1637837518000, 45.3],
  [1637837520000, 34.8],
  [1637837522000, 40.0],
  [1637837524000, 41.5]
];

const result = mergeTimeSeries([arr1, arr2, arr3]);
console.log(result); // 输出完全匹配预期结果

方案2:多指针归并实现(适合超大数据量场景)

实现逻辑:利用单数组已排序的特性,采用K路归并思路,每个数组维护一个遍历指针,每次取所有指针当前指向的最小时间戳,填充对应位置的数值后移动匹配到的指针,全程无额外排序开销。

function mergeTimeSeriesKWay(arrays) {
  const arrayCount = arrays.length;
  const pointers = new Array(arrayCount).fill(0);
  const result = [];

  while (true) {
    let minTimestamp = Infinity;
    // 查找当前所有指针指向的最小时间戳
    for (let i = 0; i < arrayCount; i++) {
      if (pointers[i] < arrays[i].length) {
        const currentTs = arrays[i][pointers[i]][0];
        if (currentTs < minTimestamp) minTimestamp = currentTs;
      }
    }
    // 所有数组遍历完成则退出循环
    if (minTimestamp === Infinity) break;

    const row = new Array(arrayCount).fill(null);
    // 填充当前时间戳对应数值,移动匹配到的指针
    for (let i = 0; i < arrayCount; i++) {
      if (pointers[i] < arrays[i].length && arrays[i][pointers[i]][0] === minTimestamp) {
        row[i] = arrays[i][pointers[i]][1];
        pointers[i]++;
      }
    }
    result.push([minTimestamp, ...row]);
  }
  return result;
}

性能对比

  • 哈希法:代码易维护,中小数据量下性能表现优异,仅在总时间戳量级超过百万级时,最后的排序步骤会产生额外开销
  • 多指针归并法:无哈希存储和排序开销,数据量越大性能优势越明显,输入数组数量少于10个时是最优选择

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:45:02