无论索引如何,检查数组是否包含共享元素

Check if arrays contain shared elements regardless of index

我想检查两个数组是否共享元素而不考虑顺序。

给出

array A: ['hello', 'how', 'are', 'you']

array B: ['how', 'are', 'hello']

return 会匹配 'hello'、'how' 和 'are'

PHP、array_intersect() (Check if array contains elements having elements of another array) 似乎有东西,但 JavaScript 没有。

如果值在对象中,我会使用 in,但它们不是:

if (key in obj) {

}

我也可以对两个数组执行 array.sort(),但不能保证两个数组具有相同数量的值。因此,即使它们被排序,比较的索引也会关闭。

如何在 JavaScript 中执行此操作?

您可以使用 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.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);

考虑到性能,我会将其中一个数组转换为对象,然后通过遍历另一个来检查交集。

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]);

但是这种方法会忽略数组中的重复项。与筛选和查找解决方案相比,这可能显得冗长。如果您正在处理大型数组的交集,这可能会有所帮助。

在这种方法中,第一个数组被转换成一个映射,以便快速查找。

第二个数组与第一个数组匹配。

复杂度为 O(a) + O(b)。

专业:优雅。

缺点:检测到重叠后继续匹配。

function array_overlap(a, b) {
  const lookup = a.reduce((m, n) => (m[n]=true, m), {});
  const status = b.reduce((m, n) => (lookup[n] || m), false);
  return status;
}