有很多关于在两个数组中查找重复项的最简单方法的帖子,但是绝对最快的方法是什么?有没有一种方法可以避免使用两个 for 循环并使函数从 O(n^2)
时间到 O(n)
时间?我拥有的数组每个包含约 1000 个项目。在运行该函数之前,我检查哪个数组更长,并将该数组用作 toCheckAgainst
变量。
var containingBoth = [];
function checkArrays(toCheck, toCheckAgainst){
for(var i=0;i<toCheck.length;i+=1){
for(var j=0;j<toCheckAgainst.length;j+=1){
if (toCheck[i] === toCheckAgainst[j]) {
containingBoth.push(toCheck[i]);
}
}
}
}
最佳答案
这可能是实现此目的的另一种方法。您当前的解决方案在两个数组上循环并在最长的数组上循环,这会减慢大型数组中的过程,例如,如果一个最长的数组有 1000 个值,而较短的数组有在这种情况下只有 2 个,您正在循环 1000 个值以找出在这种情况下不能超过 2 个的重复项。
下面的解决方案循环仅在比另一个数组短的数组上,因为我们只对重复对象感兴趣,即使两个数组的长度相同,下面的解决方案也更快,因为在您的解决方案中,您在两个数组上循环,而下面代码只是循环一个。
是否进行了一些关于比较 Niles 代码和我的速度差异的测试,请在此处查看结果 Niles Code和 my code并且每个 1000 个值的数组快大约 50%
var arr1 = ["Test1", "test2", "test3","test5","test6","test4"];
var arr2 = ["test1", "test4","test5","test6","test2","Test1"];
var result = [];
(arr1.length>arr2.length?arr2:arr1).forEach(function(key) {
if (-1 != (arr1.length>arr2.length?arr1:arr2).indexOf(key) && -1 == result.indexOf(key))
result.push(key);
}, this);
alert(result); //duplicate values arr
关于javascript - 在两个数组javascript之间查找重复项的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32620426/