2014-01-17 135 views
0

我需要檢查數組編號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; 
} 

    }; 
+1

它會包含它在相同的順序或無所謂? – Shehabix

+0

沒有順序無關緊要。 – dandlezzz

+0

實際上,有一個解決方案...我會在下面發佈它 – Shehabix

回答

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

好的重構 – dandlezzz

+0

如果順序無關緊要,那麼不可能有其他解決方案 – Shehabix

+0

沒有其他解決方案?這是一個基本的概念,我很驚訝沒有jQuery方法。 – dandlezzz

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

如果 – Tyler

+0

現在已經修復,我認爲你弄錯了第二個括號,謝謝。 –

+1

你的解決方案比我的寫得更好(下面標記的是正確的),我不知道indexOf直接與數組一起工作,沒有將它們轉換爲字符串 – Shehabix

0

你的解決方案是O(N * N )即n階平方。

您可以先對數組進行排序,然後依次檢查排序數組中的元素是否匹配。這會給你一個O(n log n)解決方案。您也可以通過確保array2的大小< = array1的大小來短路檢查。

顯然這隻有在數組足夠大的時候纔會起作用。

0

如果您有第三個對象用於跟蹤已經看到的項目,則可以在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; 
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()可能會讓事情變得更容易。

參考文獻:

相關問題