基于时间数组匹配过滤两个数组的实现与性能优化问题
优化时间匹配逻辑:解决重复、空值与性能问题
首先,咱们先梳理下你原代码的几个核心问题:
- 重复添加:找到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);
关键细节说明
- 映射表构建:
- 用
reduce+Map来构建映射,确保每个时间只对应一个匹配项(优先保留array1的第一个匹配项,array2只补充array1没有的) - 用
Map而不是普通对象,是因为时间字符串作为键更安全(避免对象键的隐式转换问题)
- 用
- 结果生成:
- 使用
map遍历timeArray,保证结果数组的长度和timeArray完全一致 - 优先级逻辑:先找array1的映射,找不到再找array2,都找不到就返回
null
- 使用
- 性能优化:
- 只需要遍历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
相关产品推荐
相关产品推荐

