2012-03-29 8 views
0

Javascriptでは、15文字の要素からなる配列が2つあり、それぞれ0から17文字です。1つの配列の値が別の配列の値と同じかどうかをJavascriptで確認する方法はありますか?

これらの2つの配列の最初の値の1つに2番目の配列の値の1つと等しい値があるかどうかを確認するにはどうすればよいですか?

例:

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'ことS'でしょうか?)があるように表示されません。 – huon

+2

私はzと文字の論理を得ていません。説明できますか? – Joseph

+0

@dbaupp:そのため、コードは最初の例ではfalseを返し、2番目の例ではtrueを返します。 – JavaAndCSharp

答えて

1

Eric 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が興味を持っている配列のサイズに関しては無関係でしょう。 –

+0

合意されていて、どちらも重要です。 :) – aaaidan

+0

これは最短で読みやすく、このケースではスピードが本当に必要ないため、受け入れられました。 – JavaAndCSharp

1

と仮定dbauppが正しいとあなたは2つの配列の交点を見つけて見たいと思って、タイプミスを持っています空でない場合

2つのセットの共通部分は、両方の元のセットに共通する要素のセットを意味します。少なくとも1つの要素が共通している場合、交差点は空ではありません。これを行うには

、二つのリストは、リストをソートして、一緒にそれらを踏んで行われる共通の要素を持っている場合は、どのリストを進めることの背後にある「であるこ​​のコードをチェックし

Simplest code for array intersection in javascript

+1

だから...私はこの質問が重複していることを意味すると思います。それは...ですか? – JavaAndCSharp

+1

あなたの質問は、共通の要素があるかどうかを見つける方法に関するものでした。 1つの(良い)答えは、2つのリストの交差を見つけることです。私が参照している質問は、2つのリストの交点を見つける方法を教えていますが、元の質問には直接答えません。 –

+0

技術的には重複していますが、精神ではないと思います。何かは、OPがセット理論の観点から考えると、たとえこれが問題を解決する最善の方法であるとしても、私に言っています。 – aaaidan

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。エリック氏は、2つのリストを交差させて、結果リストが空ではないことを確認したが、このコードは新しいリスト全体を生成する必要がないため、効率的である共通の要素がある場合は、両方のリストのすべてに適用されます。

0

[OK]を、私が正しくあなたの問題を理解することだと仮定すると、私は一緒に使用して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

私は上のそれぞれの方法を使用しようとしましたが、「それぞれ」はオブジェクトではなく配列で使用されていますが、うまくいかないようです。 私はコードを変更します。

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

2階?そう? – aaaidan

0

ほとんどのブラウザでは、これらのメソッドを使用する場合、多くの場合、あなたは条件付きで古いブラウザに にそれらを追加することができアレイ、 の組み込みのindexOfおよびフィルタメソッドを使用します。 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']; 
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; 
} 
関連する問題