我想检查两个数组是否共享元素,无论顺序如何。
鉴于
array A: ['hello', 'how', 'are', 'you']
array B: ['how', 'are', 'hello']
将返回'你好',''和'''
的匹配 PHP似乎有些东西,array_intersect()
(Check if array contains elements having elements of another array),但JavaScript没有。
如果值在对象中,我会使用in
,但它们不是:
if (key in obj) {
}
我也可以对两个数组进行array.sort()
,但不能保证两个数组都具有相同数量的值。因此,即使它们被排序,比较的指数也会被取消。
我如何在JavaScript中执行此操作?
答案 0 :(得分:2)
您可以使用filter检查另一个数组中是否存在相同的元素。
var arr1 = ['hello', 'how', 'are', 'you'];
var arr2 = ['how', 'are', 'hello'];
var commonElements = arr1.filter(function(e) {
return arr2.indexOf(e) > -1;
});
console.log(commonElements);
您也可以在Array prototype
上定义此功能
Array.prototype.intersection = function(arr) {
return this.filter(function(e) {
return arr.indexOf(e) > -1;
});
};
var arr1 = ['hello', 'how', 'are', 'you'],
arr2 = ['how', 'are', 'hello'];
var commonElements = arr1.intersection(arr2);
console.log(commonElements);
答案 1 :(得分:0)
考虑性能我将其中一个数组转换为一个对象,然后通过遍历另一个来检查交集。
var arr1 = ['hello', 'how', 'are', 'you'];
var arr2 = ['how', 'are', 'hello'];
var set = {};
var intersect = [];
for (var i = 0; i < arr1.length; i++)
set[arr1[i]] = true;
for (var i = 0; i < arr2.length; i++)
if (set[arr2[i]]) intersect.push(arr2[i]);
但是此方法将忽略数组中的重复项。与过滤器和找到解决方案相比,这可能看起来很冗长。如果您正在进行大型数组的交叉,这可能会有所帮助。
答案 2 :(得分:0)
通过这种方法,第一个数组将转换为映射,以便快速查找。
第二个数组与第一个数组匹配。
复杂度为O(a)+ O(b)。
Pro:优雅。
缺点:检测到重叠后,匹配就会继续。
http://server/status?stat=a&stat=b