检查一个数组的值是否在另一个数组中

时间:2014-01-17 23:04:39

标签: javascript arrays

我需要检查数组2是否包含数组1中的所有值。我不知道有任何方法可以做到这一点,所以我开发了一个有效的方法,我想。有没有更好的方法来做到这一点,这是一个很好的解决方案吗?

    var contains = function(a1, a2){
var cCount = 0;
for (var i=0; i<a1.length; i++){
     for (var j=0; j<a2.length; j++){
         if (a1[i] == a2[j]){
             cCount++;             
         }}}
if (cCount == a1.length){
    return true;
}

  };

5 个答案:

答案 0 :(得分:1)

您可以在开始前检查尺码。当一个不存在而不是使用计数器时返回false。如果到达终点则返回true。并且每次都使用indexof循环遍历a2。

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

答案 1 :(得分:0)

只是简单的代码:

function contains(array1, array2){
    var found = false;
    for (i in array1) {
       for (j in array2) {
           if (array1[i] == array2[j]) {
              found = true;
           }
       }
       if (!found) return false;
    }
    return true;
}

另一种解决方案我不是很喜欢它,但它更短......

function contains (arr1, arr2) {
   var specialChar = "|"; // Use any char or a sequence that won't exist in values.
   var str = specialChar + arr2.join(specialChar) + specialChar;
   for (i in arr1) if (str.indexOf(specialChar + arr1[i] + specialChar) == -1) return false;
   return true;
}

答案 2 :(得分:0)

你的解是O(n * n),即n阶平方。

您可以先对数组进行排序,然后依次检查已排序数组中的元素是否匹配。这将为您提供O(n log n)解决方案。您还可以通过确保array2的大小&lt; = array1的大小来短路检查。

显然,只有你的数组足够大才有意义。

答案 3 :(得分:0)

如果您有第3个对象用于跟踪已经看过的项目,则可以在O(n)中执行此操作。这假设seen中的查找是O(1)(可能是 - What's the big O for JavaScript's array when used as a hash?

var seen = {};
arr2.forEach(function(el) {
  seen[el] = true;
});

var allContained = true;
arr1.forEach(function(el) {
  if ( allContained && !seen[el] ) {    
    allContained = false;
  }
});

return allContained;

答案 4 :(得分:0)

我个人使用Array.every()方法(当然,这取决于实现此方法的浏览器)与Array.indexOf()一起使用,这会产生类似于以下内容的东西:

var contains = function(needle, haystack){
    return needle.every(function(a){
        return haystack.indexOf(a) > -1;
    });
};

将其与您已经制作的方法相结合(测试浏览器支持):

var contains = function(needle, haystack){
    if ([].every){
        return needle.every(function(a){
            return haystack.indexOf(a) > -1;
        });
    }
    else {
        var result = true;
        for (var i = 0, len = needle.length; i < len; i++){
            if (haystack.indexOf(needle[i]) === -1) {
                return false;
            }
        }
        return result;
    }
}
var a1 = [1,2,3],
    a2 = [1,2,3,4];
console.log(contains(a1, a2));

JS Fiddle demo

请注意,else代码未经过优化,只是为了演示代码。话虽如此,在MDN页面(在下面的参考文献中)中有Array.every()的垫片可能会使事情变得更容易。

参考文献: