2011-11-30 2 views
19

私はjavascriptで2つの配列を比較しようとしています。javascriptの驚くべき配列の比較

私がしたいことは次のとおりです。

< B ⇔ ∃私は≥ 0 S。T. a [i] < b [i]と&ltall; 0 ≤ J < I、[J] =のB [j]は

は、所望の非負の数のワークの配列:

firebug> [0,1,2,3,4] < [1,0,0] 
true 

と、比較負の数をゼロ作品では、予想通り:

firebug> [-1, 1] < [0, 0] 
true 

しかし、負の数と負の数を比較することである...思わぬ:

firebug> [-2] < [-1] 
false 
firebug> -2 < -1 
true 

ここでは何が起こっているのですか?どのアレイ比較のために私の直感を修正できますかをjavascriptで意味しますか?

+0

参照です。 //stackoverflow.com/q/16566772/1048572)を参照してください。解決方法については、[Javascriptでの配列のスリーウェイ比較関数](http://stackoverflow.com/q/23881838/1048572) – Bergi

答えて

21

("" + array1) < ("" + array2) 

か:として

array1 < array2 

がまったく同じ結果を得ます文字列は.join()になり、要素はカンマ()で結合されます)を区切り文字として使用します。

"-1,1" < "0,0" === true 

文字コード-(45)文字コード0(48)よりも小さいためです。一方

"-2" < "-1" === false 

第2の文字コードが比較されているので(第一の両方-であるので、それはまだ結果を与えない)、および2の文字コード(50) の文字コード1(49)より大きいので、これはfalseとなります。

要素が数値であっても(文字列強制のため)、字句解析による並べ替え(つまり文字コードによる)になります。

基本的に配列を比較することはお勧めしません。これは文字列の比較として暗黙的に定義されていますが、これにより驚くべき結果が得られます。

は、私が実際にJavaScriptで配列を比較し、「期待される」結果を取得する方法についての答えを見つけることができませんでした
+0

so 、 '+ [ - 2] - + [ - 1];はそのトリックを行うべきです。 – jAndy

+1

@jAndy:それはもう1つの要素の配列に対してうまくいきます。 '-2 - 1'はもう少し明確になります... – pimvdb

6

JavaScript配列の比較は、あなたの説明と似た形ではありません。

どのような状況でも、配列はまず内容を結合して文字列に変換されます。したがって、 "-2"という文字列は文字セット内で "1"の後に来るので、ではなく、文字列 "-1"より小さい。同様に、 " - 1"は数字の前に来るので "-1,1"は "0,0"より小さい。

あなたはすべてのケースでは、あなたの比較のことを自分で見ることができます。配列が変換され

array1.join(",") < array2.join(",") 
1

ので、ここも[配列はJavaScriptで比較されている方法](HTTPコード

compareArrays = function(a, b) { 
    var elA, elB, i, len; 
    for (i = 0, len = Math.min(a.length, b.length); i < len; i++) {    
    elA = a[i], elB = b[i]; 
    if (elA > elB) return 1; 
    if (elA < elB) return -1; 
    } 
    return b.length - a.length; 
}; 

console.log(compareArrays([-2], [-1])) # -1 
console.log(compareArrays([], [])) # 0 
console.log(compareArrays([null], [undefined])) # 0 
console.log(compareArrays([1, 2, 3], [1, 2, 3, 4])) # 1 
console.log(compareArrays([0, 2], [0, 1])) # 1 
console.log(compareArrays([1], [NaN])) # 0 
console.log(compareArrays([NaN], [1])) # 0