比较多个数组中的值

时间:2015-02-12 17:33:16

标签: javascript arrays

我有两个数组,我需要比较值并获取重复项。我写了大部分代码,但似乎对比较感到难过。

这是我的代码:

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语句比较不起作用。有没有什么我没有得到比较数组中的值?

我不是在寻找直接答案,而是在可能的情况下提供指导。

1 个答案:

答案 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循环
  • 检查内置函数的所有功能并尽可能使用它们
  • 并且,为了理智,永远不要使用==