2012-03-29 81 views
0

在Javascript中,我有2個由15個字符串元素組成的數組,每個元素的長度爲0到17個字符。如何判斷一個數組中的值是否等於Javascript中另一個數組中的值?

如何判斷這兩個數組中的第一個的某個值的值是否等於第二個數組的某個值?

實施例:

var array1 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o']; 
var array2 = ['z','z','z','z','z','z','z','z','z','z','z','z','z','o','z']; 
myFunction(array1,array2); // returns false 

實施例2:

var array1 = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','s']; 
var array2 = ['z','z','z','z','z','z','z','z','z','z','z','z','z','o','z']; 
myFunction(array1,array2); // returns true 
+2

在你的第二個例子中,似乎沒有共同的元素(應該是'o'?)。 – huon 2012-03-29 01:10:30

+2

我沒有得到z和字母的邏輯。你可以解釋嗎? – Joseph 2012-03-29 01:12:03

+0

@dbaupp:這就是爲什麼代碼對第一個示例返回false,對第二個返回true的原因。 – JavaAndCSharp 2012-03-29 01:15:21

回答

1

埃裏克J.的交點建議可能是最優雅的方法來解決這個問題。

你問什麼能像這樣工作的直接轉換:

function containsAny(array1, array2) { 
    for (var i=0; i<array1.length; i++) { 
     for (var j=0; j<array2.length; j++) { 
      if (array1[i] == array2[j]) return true; 
     } 
    } 
    return false; 
} 

var array1 = ['a','b','c']; 
var array2 = ['1','2','3']; 
var array3 = ['a','b','2']; 

containsAny(array1, array2); // returns false 
containsAny(array2, array3); // returns true 
containsAny(array1, array3); // returns true 
+0

直截了當,但是執行O(N-squared)。但是,這個事實可能是無關緊要的,但是對於OP感興趣的陣列大小來說。 – 2012-03-29 01:24:37

+0

同意,兩個都是重要的。 :) – aaaidan 2012-03-29 01:36:16

+0

接受,因爲它是最短的,最可讀的,我真的不需要在這種情況下的速度。 – JavaAndCSharp 2012-03-29 03:19:33

1

假設dbaupp是正確的,你有一個錯字,要查找兩個陣列的交叉點和看如果它不是空的。

兩個集合的交集意味着兩個原始集合有共同的元素集合。如果共有至少一個元素,則交集將是非空的。

要做到這一點,看到

Simplest code for array intersection in javascript

+1

所以...我想這意味着這個問題是重複的。是嗎? – JavaAndCSharp 2012-03-29 01:17:56

+1

不完全......你的問題是關於如何找到是否有一個共同的元素。一個(好的)答案是找到兩個列表的交集。我參考的問題說明如何找到兩個列表的交集,但不直接回答您的原始問題。 – 2012-03-29 01:22:21

+0

從技術上來說,這是一個重複的事情,但我認爲這不符合精神。有些東西告訴我,OP沒有用集合論的思想來思考,即使這是解決問題的最好方法... – aaaidan 2012-03-29 01:33:22

1

此代碼檢查,如果兩個列表都有一個共同的元素,這是通過排序列表,然後通過他們踩着一起完成,推進取其名單「的背後」。

function(list1, list2) { 
    var l1 = list1.sort(), l2 = list2.sort(), 
     len1 = l1.length, len2 = l2.length, 
     i1 = 0, i2 = 0; 

    while (i1 < len1 && i2 < len2) { 
     if (l1[i1] == l2[i2]) 
      return true; 

     if (l1[i1] < l2[i2]) 
      i1++; 
     else 
      i2++; 
    } 
    return false; 
} 

NB。正如埃裏克說,你也可以交叉這兩個列表,並檢查結果列表是非空的,但這裏的代碼將更有效,因爲它不必生成一個全新的列表,也不必去通過所有這兩個列表,如果有一個共同的元素。

0

好吧,假設我正確理解你的問題,我扔在一起的小提琴將使用匹配2個數組的元素JQuery的 '每個' 方法:

http://jsfiddle.net/phillipkregg/Ug3DM/1/

var array1 = ["a","b","c","o"]; 
var array2 = ["z","z","b","z","z","o"]; 

array1.each(function(item){ 
    var element = item;   
    var match = []; 
    array2.each(function(item2) { 
     if (item2 === element) 
     { 
      match.push(item2); 
      alert(match); 

     }    
    });     
});​ 

也許,這將讓你開始。

0

我嘗試在樓上使用'each'方法,但它似乎不起作用,而'each'用於對象,不用於數組。 所以我改變了代碼。如果你使用這些方法往往可以將其添加有條件向 舊的瀏覽器

var array1 = ["a","b","c","o"]; 
var array2 = ["z","z","b","z","z","o"]; 
var match = []; 
$.each(array1, function(key, val){ 
var element = val; 
    $.each(array2, function(key, val){ 
    if(element === val) 
    { 
    match.push(val); 
    } 
    }); 
}); 
$.each(match, function(key, val){ 
    alert(key+'--'+val); 
}); 
+1

樓上? whaaa? – aaaidan 2012-03-29 02:23:04

0

大多數瀏覽器使用數組, 的內置的indexOf和過濾方法。

var array1= ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 's']; 
var array2= ['z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'z', 'o', 'z']; 
var array3= ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'o', 'k', 'l', 'm', 'n', 's']; 


1. array1.inCommon(array2)>> 
(array length 0) 

2. array2.inCommon(array3)>> 
(array length 1) 
o 

3. array3.inCommon(array1)>> 
(array length 14) 
a, b, c, d, e, f, g, h, i, k, l, m, n, s 



Array.prototype.inCommon= function(ar){ 
    return this.filter(function(itm){ 
     return ar.indexOf(itm)!= -1; 
    }); 
} 

Array.prototype.indexOf= Array.prototype.indexOf || function(what, i){ 
    if(typeof i!= 'number') i= 0; 
    var L= this.length; 
    while(i< L){ 
     if(this[i]=== what) return i; 
     ++i; 
    } 
    return -1; 
} 

Array.prototype.filter= Array.prototype.filter || function(fun, scope){ 
    var T= this, A= [], i= 0, itm, L= T.length; 
    if(typeof fun== 'function'){ 
     while(i< L){ 
      if(i in T){ 
       itm= T[i]; 
       if(fun.call(scope, itm, i, T)) A[A.length]= itm; 
      } 
      ++i; 
     } 
    } 
    return A; 
} 
相關問題