检查数组是否包含共享元素而不管索引

时间:2015-10-06 04:17:01

标签: javascript arrays matching

我想检查两个数组是否共享元素,无论顺序如何。

鉴于

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中执行此操作?

3 个答案:

答案 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