大数组查找优化的一个问题?-灵析社区

拽嘻嘻

var arr1=[2,4,5,7,10] var arr2=[1,2,3,4,5,6,7,8,9,10,11,1,12,5......]//假如这个数组中存在大量数据 arr1.map((item)=>{ arr2.map((current,index)=>{ if(item == current){ ..... arr2.splice(index,1);//如果每次符合条件后,我就把符合过条件的数据从这个大数组中删除,减少下一次循环时候的数据量。结果发现这样不行,结果不对了。 } }) }) 我有这样两个数组需要循环匹配出结果,如果没有用splice,出来的结果是正确的。但是我想优化下循环查找的代码,发现结果不对了 后来我又试了下splice函数 ![image.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250103/e73f0e3a7c67c42a3a11f7d540b96b5f.png) 发现果然结果和我预想的不同了 请问上面的代码我该如何降低每次的循环量?

阅读量:185

点赞量:6

问AI
const arr1 = [2, 4, 5, 7, 10]; const arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 12, 5]; // 直接用 includes 来判断是否存在于 arr1 中 const r1 = arr2.filter(n => !arr1.includes(n)); console.log(r1); // [1, 3, 6, 8, 9, 11, 1, 12] // 如果 arr1 也比较大,可以先生成集合,通过集合来检查会更快;生成集合的同时也可以去重 const arr1Set = new Set(arr1); const r2 = arr2.filter(n => !arr1Set.has(n)); console.log(r2); // [1, 3, 6, 8, 9, 11, 1, 12] 如果你确实需要通过 "splice" 来修改原数组,可能从最后一个元素开始,按逆序来处理,这样就不存在索引移位的问题。不过理论上来说,删除索引是个重量级操作 —— 对真数组来说,每次删除元素都会造成后面的所有元素重排,非常耗时。 如果又想改原数组,又想优化,就需要自己写算法。假如你的是作业,那么接下来的东西就是你需要写的内容了: 1. 找到第一个需要删除的位置 "x",记录 "s = x" 2. 从 "x + 1" 开始找到下一个不需要删除的位置 "y" 3. 从 "y + 1" 开始找到再下一个需要删除的位置 "z" 4. 将从 "y" 到 "z"(不含)之间的元素挪到 "s" 处,记录结束位置 "p"(此时 "p = s + (z - y)") 5. 赋值 "s = p; x = z",从第 2 步开始重复处理 6. 注意上述循环的退出条件和剩余处理 大概画了个示意图,看你能懂不 "snipaste_2023-09-26_15-41-17.png" (https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20241221/ea593b1c89664a176ec7884101784e6a.png)