我有两个数组,我需要比较值并获取重复项。我写了大部分代码,但似乎对比较感到难过。
这是我的代码:
function compare(arr1, arr2) {
for (var i = 0; i< arr1.length; i++) {
for (var j = 0; j < arr2.length; j++) {
if (arr1[i] == arr2[j]) {
console.log[i];
}
}
}
}
compare([5, 3, 2, 5, 1, 6], [6, 4, 2, 7, 10]);
我得到for循环来打印所有数字,但由于某种原因if语句比较不起作用。有没有什么我没有得到比较数组中的值?
我不是在寻找直接答案,而是在可能的情况下提供指导。
答案 0 :(得分:2)
您的代码是时间二次的,因为它为第一个数组中的每个项目迭代第二个数组。线性时间解决方案是将第一个数组转换为哈希表,然后,对于第二个数据中的每个项目,立即检查它是否在哈希中。
function intersect(a, b) {
var hash = {};
a.forEach(function(x) { hash[x] = 1 });
return b.filter(function(x) { return hash[x] === 1 });
}
c = intersect([5, 3, 2, 5, 1, 6], [6, 4, 2, 7, 10]);
document.write(c)
但请注意,这仅适用于要比较的项目是基元,您不能将对象放入哈希值,因此代码必须是二次的:
function intersect(a, b) {
return a.filter(function(x) {
return b.indexOf(x) >= 0
});
}
a = {x:'a'};
b = {x:'b'};
c = {x:'c'};
d = {x:'d'};
i = intersect([a,b,c], [a,b,d]);
document.write(JSON.stringify(i));
关于改进当前代码的问题,我建议您使javascript更加惯用,特别是
for
循环==