2016-05-16 32 views
3

我有兩個數組,我不知道該數組的值之前我Ant來測試什麼,我指的是陣列的lenght是動態如何檢查存在於其他陣列中的值,反之亦然

我的問題是如何檢查兩個數組有ateast一個共同的價值

假設我有兩個數組這樣 情況下1:

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

當我們比較這些陣列通過像campareArray函數(數組1,數組2)應返回true, 和這樣同一個陣列:

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

應返回true

會是怎樣的有效途徑?我們可以檢查數組長度並檢查indexof從大到小還有其他什麼好方法?

+0

'Array.prototype.some()' – Redu

回答

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 但如果arr2是多少大於arr1,這將是值得考慮的反轉循環順序(由運行時檢查):

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

值得一時間執行時間是相同的,但具有更好的平均由於更好的內存訪問(因爲小陣將適合在緩存中,而大的不會)。

如果小陣列是一個litteral對象,它會更好,因爲在一個對象上的鍵查找比在數組上的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; 
} 
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

一些()接受一個回調,一旦回調返回「真」,將停止迭代,而不是每一個()。這是它的典型用法。我喜歡這個答案。 – Jacob

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>