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

基于时间数组匹配过滤两个数组的实现与性能优化问题

优化时间匹配逻辑:解决重复、空值与性能问题

首先,咱们先梳理下你原代码的几个核心问题:

  • 重复添加:找到array1中的匹配项后,没有终止后续逻辑,还会继续遍历array2,导致同一个时间可能被多次推入结果数组
  • 无匹配项未处理:只有找到匹配时才push值,没找到的时间对应的位置会缺失,无法得到null
  • 性能隐患:每次遍历timeArray都要完整遍历array1和array2,时间复杂度是O(T*(A1+A2)),当数组规模变大时,效率会急剧下降

最优实现方案:预构建映射表+单次遍历

核心思路是先把array1和array2的时间(第6位,索引6)预存为键值对映射,这样后续查找匹配项的时间复杂度是O(1),整体时间复杂度降到O(A1+A2+T),高效又简洁。

// 示例数据(假设你的array1、array2结构类似这样)
const timeArray = ["13:37", "13:36", "13:35", "13:34", "13:33", "13:32"];
const array1 = [
  [1,2,3,4,5,6,"13:37"],
  [1,2,3,4,5,6,"13:36"],
  // 可以有重复时间的项,这里只保留第一个匹配的
];
const array2 = [
  [1,2,3,4,5,6,"13:36"], // 即使array2也有,优先取array1的
  [1,2,3,4,5,6,"13:34"],
  [1,2,3,4,5,6,"13:32"],
];

// 步骤1:构建array1的时间映射(每个时间只保留第一个匹配项)
const map1 = array1.reduce((acc, item) => {
  const time = item[6];
  if (!acc.has(time)) { // 如果已有该时间的映射,跳过(保证只存第一个)
    acc.set(time, item);
  }
  return acc;
}, new Map());

// 步骤2:构建array2的时间映射(仅存array1中没有的时间)
const map2 = array2.reduce((acc, item) => {
  const time = item[6];
  if (!map1.has(time) && !acc.has(time)) {
    acc.set(time, item);
  }
  return acc;
}, new Map());

// 步骤3:遍历timeArray生成最终结果
const finalArray = timeArray.map(time => {
  return map1.get(time) || map2.get(time) || null;
});

console.log(finalArray);

关键细节说明

  1. 映射表构建:
    • 用reduce+Map来构建映射,确保每个时间只对应一个匹配项(优先保留array1的第一个匹配项,array2只补充array1没有的)
    • 用Map而不是普通对象,是因为时间字符串作为键更安全(避免对象键的隐式转换问题)
  2. 结果生成:
    • 使用map遍历timeArray,保证结果数组的长度和timeArray完全一致
    • 优先级逻辑:先找array1的映射,找不到再找array2,都找不到就返回null
  3. 性能优化:
    • 只需要遍历array1、array2各一次,再遍历timeArray一次,不管数组多大,效率都远高于嵌套循环

针对你原代码的补充说明

如果你的需求只是要把匹配到的时间字符串推入结果(而不是整个数组项),只需要把映射表的值改成时间字符串即可:

const map1 = array1.reduce((acc, item) => {
  const time = item[6];
  if (!acc.has(time)) {
    acc.set(time, time);
  }
  return acc;
}, new Map());
// map2同理,然后finalArray的逻辑不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:57:32