如何检查一个值是否存在于另一个数组中,以及反之亦然

3

我有两个数组,不知道它们的值,在进行任何测试之前,我的意思是数组的长度是动态的。

我的问题是如何检查两个数组是否至少有一个共同的值。

假设我有两个如下的数组:

情况 1:

array1 = ["this", "is", "array"]
array2 = ["this"]

当我们使用类似compareArray(array1, array2)的函数比较这些数组时,应该返回true,就像这个相同的数组:

array1 = ["this"]
array2 = ["this", "is", "array"]

应该返回 true。

什么是高效的方法?我们可以检查数组长度并从大到小检查 indexof,还有其他好的方法吗?


Array.prototype.some() - Redu
4个回答

2
使用some()方法,它会检查数组中的任何一个元素是否通过了提供的测试函数。

var array1 = ["this", "is", "array"];
var array2 = ["this"];

var haveOne = array1.some(function (n) {
  return array2.indexOf(n) >= 0;
});

console.log(haveOne);


1
some() 接受一个回调函数,一旦回调函数返回“true”,它将停止迭代,与 every() 相反。这是它的典型用法。我喜欢这个答案。 - sfy

1
你可以使用 filter() 方法,获取两个数组的交集。

var array1 = ["this", "is", "array"],
  array2 = ["this"];

var result = array1.filter(function(n) {
  return array2.indexOf(n) != -1;
});
console.log("Arrays have common element: " + !!result.length)
console.log(result)


0
在第一次尝试中,一个简单的循环就足够了:
版本1
function intersect(arr1, arr2) {
    for(var i =0; i < arr1.length; ++i)
        if(arr2.indexOf(arr1[i]) >= 0))
            return true;
}

版本2 但是如果arr2arr1大得多,那么考虑反转循环顺序(通过运行时检查)可能会更值得:

function intersect(arr1, arr2) {
  if(arr1.length < arr2.length) {
     return intersect(arr2, arr1);
  }
  for(var i =0; i < arr1.length; ++i)
      if(arr2.indexOf(arr1[i]) >= 0))
           return true;
   return false;
}

执行时间相同,但由于更好的内存访问,平均值更好(因为小数组将适合缓存,而大数组不会)。

如果小数组是一个字面对象,那就更好了,因为在对象上进行键查找比在数组上进行indexOf要快得多。

function intersect2(arr1, arr2) {
    if(arr1.length >= threshold || arr2.length <= threshold) { // to be experimented
        return intersect(arr1, arr2);
    }


    var keys = {};
    for(var i = 0; i < arr1.length; ++i) {
       keys[arr[i]] = true;
    }

    for(var i = 0; i < arr2.length; ++i) {
        if(keys[arr2.length]) 
            return true;
    }

    return false;
}

0
只需找到这些数组之间的交集。请参考下面的示例。
 <script>
     var alpha = ["this", "is", "array"],
     beta = ["this"];

    $.arrayIntersect = function(a, b)
    {
        return $.grep(a, function(i)
        {
            return $.inArray(i, b) > -1;
        });
    };

    console.log( $.arrayIntersect(alpha, beta) );
 </script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接