簡體   English   中英

檢查一個數組的值是否在另一個數組中

[英]Check if the values of one array are in another

我需要檢查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;
}

  };

您可以在開始之前檢查尺寸。 如果不存在,則使用計數器返回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;
}

只是一些簡化的代碼:

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;
}

您的解決方案是O(n * n),即n平方的階。

您可以先對數組進行排序,然后順序檢查排序后的數組中的元素是否匹配。 這將為您提供O(n log n)解決方案。 您也可以通過確保array2的大小<= array1的大小來使檢查短路。

顯然,這僅在陣列足夠大的情況下才重要。

如果您有第三個對象來跟蹤已經看到的項目,則可以在O(n)中執行此操作。 這是假設在查找seen是O(1)(這大概是- ?作為哈希使用時,什么是對JavaScript的數組大O

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

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

return allContained;

我個人將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小提琴演示

請注意, else代碼並沒有得到優化,只是在這里演示了代碼。 話雖如此,MDN頁面(在下面的引用中)中有一個Array.every()的填充Array.every() ,這可能會使事情變得更容易。

參考文獻:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM