2012-02-12 13 views
3

を比較し、彼らは限り、それは例えばジャバスクリプト、潜在的に大きさの異なる二つの配列と異なるサイズの配列

var a1 = [ 1, 2, 3 ]; 
var a2 = [ 1, 2 ]; 
var a3 = [ 1, 3 ]; 

a1 == a2 => true; 
a1 == a3 => false; 

午前に行くのと同じあるかどうかを確認するための最良の方法何ですこれは何千回も行われており、構文はうまく記憶されています。

+0

最初のtrueと2番目のfalseはなぜですか? – Gumbo

+0

なぜ 'al'と' a2'が同じですか? 'a2'の内容は' a1'の中にあるからです? –

答えて

3
function compareArraySeq(a, b) { 
    return a.slice(0, b.length).join(' ') == b.slice(0, a.length).join(' '); 
} 
+0

が優秀!!関数呼び出しは必要ありません!オーバーヘッドをあまりにも悪くしないでください。 –

+0

@ccyoungこれは空の文字列配列要素では失敗します。使用しないでください。 – Tomalak

+0

@Tomalak - 空の配列で正しくテストされています - あなたの言っていることが見当たりません - 例を挙げることはできますか?ありがとう –

4

これについては(私はa1とa2についてデモンストレーションします)>

var min_val = min(a1.length, a2.length); 
var equals = true; 

for(i = 0; i < min_val; i++) 
{ 
    if(a1[i] != a2[i]) 
    { 
     equals = false; 
     break; 
    } 
} 

結果は等価変数になります。関数をこのようにしたい場合は、引数としてa1とa2を渡し、equalsを返します。

+0

true、これはそれを解決しますが、スライスなどでは関数を作成せずに済み得ると考えていました –

+1

スライス解法とは異なり、これは非スカラー値、つまりオブジェクトの配列でも機能します。 – georg

3
function compareArraySeq(a1, a2) { 
    var i, l = Math.min(a1.length, a2.length); 

    for (i=0; i<l; i++) { 
    if (a1[i] !== a2[i]) return false; 
    } 
    return true; 
} 
0
function prefixEqual(a, b) { 
    var prefixLength = a.length < b.length ? a.length : b.length; 
    for(var i = 0; i < prefixLength; i+=1) 
     if(a[i] != b[i]) 
      return false; 
    return true; 
} 
0

一度に一つのスポットをチェックするループを作ります。

var compare = function (a1, a2) { 
    var l = Math.min(a1.length, a2.length); 
    for (var i = 0; i < l; i++) { 
     if (a1[i] !== a2[i]) { 
      return false; 
     } 
    } 
    return true; 
} 

今、あなたはこのような配列を比較することができます:

var a = [0, 1, 2, 3]; 
var b = [0, 1, 2]; 
var c = [0, 1, 3]; 

compare(a, b); //true 
compare(a, c); //false 

希望これはあなたのために働く:)

フィドルリンク:http://jsfiddle.net/8zbJj/1/

3

[編集を私はこの作った ]に基づいてTomalaksコメント私はJSONが救助に来ることができると言っています。

だから、再び:ここにあなたが何をしたいのか[Iが思う]ないアレイの拡張です:

function comparePartial(arr1,arr2){ 
    var arr2 = this, l1 = arr1.length, l2 = arr2.length; 

    return (l1<1 || l2<1 
      ? false : 
       JSON.stringify(arr1.slice(0, l2)) === 
       JSON.stringify(arr2.slice(0, l1)) 
     ); 
} 
Array.prototype.comparePartial = 
    Array.prototype.comparePartial || comparePartial; 

//usage 
    var a1 = [ 1, 2, 3 ] 
    ,a2 = [ 1, 2 ] 
    ,a3 = [ 1, 3 ] 
    ,a4 = ['',''] 
    ,a5 = ['','',''] 
    ,a6 = [] 
    ,a7 = ['bla','doh',1] 
    ,a8 = ['bla','doh',1,'yeah','really'] 
    ,a9 = [1,3,5,'doh'] 
    ,a10= ['1','3','5','doh'] 
    ,a11= [{a:1,b:2},{c:3,d:4}] 
    ,a12= [{a:1,b:2},{c:3,d:4},{e:5,f:6}] 

console.log(
    [ a1.comparePartial(a2) 
    ,a2.comparePartial(a1) 
    ,a1.comparePartial(a3) 
    ,a4.comparePartial(a5) 
    ,a5.comparePartial(a6) 
    ,a1.comparePartial(a6) 
    ,a8.comparePartial(a7) 
    ,a10.comparePartial(a9) //=> 'type safe' comparison 
    ,a11.comparePartial(a12) //=> can compare arrays of Objects 
    ].join(' - ') 
); //=> true - true - false - true - false - false - true - false - true 
+0

かなり賢い。 _could_関数defを使わずにこのアプローチを使用しますが、_way _はあまりにも多くの型付けを行います。 –

+0

配列エクステンションがアイデアですか? – KooiInc

+1

@ KooiInc [この回答](http://stackoverflow.com/a/9248739/18771)に私のコメントを参照してください。配列をStringに変換しても、配列は切り取られません。 – Tomalak

0

あなたの配列は、文字列や数値またはブール値であれば、あなたはそれらの文字列値を比較することができます。

function compareSimpleValues(a,b){ 
    if(a.length>=b.length)return String(a).indexOf(String(b))===0; 
    return String(b).indexOf(String(a))===0; 
} 
関連する問題