2010-08-08 28 views
8

假设我们有:比较在Javascript两个数组 - 选举差异

array1 = ['A', 'B', 'C', 'D', 'E']; array2 = ['C', 'E']; 

有没有一种成熟,快速的解决方案,以对抗对方两个数组比较,返回一个数组没有出现在两个数组中的值(C和E在这里)。 所以:

array3 = ['A', 'B', 'D'] 

应该是解决方案的输出。 (jQuery可能涉及)

thx。

+0

是阵列都始终排序,在你的榜样?如果是这样,只需走阵列即可在线性时间内完成。 – 2010-08-08 03:25:01

回答

11

这是一组差异。一个简单的实现是:

jQuery.grep(array1, function(el) 
        { 
         return jQuery.inArray(el, array2) == -1; 
        }); 

这是O(m * n),其中那些是数组的大小。你可以做O(m + n),但你需要使用某种散列集。您可以使用JavaScript对象作为字符串的简单哈希集。对于相对较小的阵列,上述应该没问题。

+0

thx,这是一个很好的简短解决方案。 – Hans 2010-08-08 03:42:13

+0

请考虑更新此答案以使用Array.prototype.filter而不是jQuery.grep,因为即使jQuery不被允许,它也会提供解决方案。 – 2013-12-13 15:10:10

+0

[Array.prototype.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)确实是一个无库替代方案。但是,您也需要[Array.prototype.indexOf](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf)(而不是inArray)。但是,两者都需要在旧版浏览器中加载polyfill(在链接处提供)以实现广泛的兼容性。 由于该问题允许jQuery,因此我使用了它,因为它有它自己的polyfill。 – 2013-12-17 02:28:09

0

一个经过验证的快速解决方案,我知道是一个二进制搜索,你可以使用排序后的数组。所以解决方案需要花费时间,这取决于排序算法。但至少是log(N)。

13

我接受了Matthews解决方案,但不想忽略我刚发现的另一个更快的解决方案。

var list1 = [1, 2, 3, 4, 5, 6]; 
var list2 = ['a', 'b', 'c', 3, 'd', 'e']; 
var lookup = {}; 

for (var j in list2) { 
     lookup[list2[j]] = list2[j]; 
    } 

    for (var i in list1) { 
     if (typeof lookup[list1[i]] != 'undefined') { 
      alert('found ' + list1[i] + ' in both lists'); 
      break; 
} 
} 

来源:Optimize Loops to Compare Two Arrays

+1

这帮了我很多 - 感谢发布。 – cantera 2012-05-11 00:56:01

+0

如果其中一个列表(这里是列表2)需要与许多候选人(许多列表1)进行比较,那就特别好。 Chrome上的 – JPM 2013-01-20 20:42:35

+1

,链接的源参考被发现为包含恶意软件 – superjos 2013-07-01 15:49:34