假设我们有:
array1 = ['A', 'B', 'C', 'D', 'E']; array2 = ['C', 'E'];
是否有一种经过验证的快速解决方案可以将两个数组相互比较,返回一个数组而不会在两个数组中出现这些值(此处为C和E)。 所以:
array3 = ['A', 'B', 'D']
应该是解决方案的输出。 (可能涉及jquery)
THX。
答案 0 :(得分:13)
我接受了马修斯解决方案,但不想忽略我刚刚发现的另一种更快的解决方案。
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;
}
}
答案 1 :(得分:11)
这是一个集合差异。一个简单的实现是:
jQuery.grep(array1, function(el)
{
return jQuery.inArray(el, array2) == -1;
});
这是O(m * n),其中那些是数组的大小。您可以在O(m + n)中执行此操作,但您需要使用某种哈希集。您可以将JavaScript对象用作字符串的简单哈希集。对于相对较小的阵列,上述情况应该没问题。
答案 2 :(得分:0)
我所知道的一种经过验证的快速解决方案是您可以在对其中一个阵列进行排序后使用的二进制搜索。所以解决方案需要的时间取决于排序算法。但至少是log(N)。