2011-11-30 91 views
19

我想在javascript中比較兩個數組。javascript令人驚訝的數組比較

我想的是:

一個< b ⇔ ∃我≥ 0 S.T. a [i] < b [i]和[forall; 0 ≤Ĵ< I,A [J] = B [j]的

因此,作爲所希望的非負數工作陣列:如預期

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

以及比較負數與零部作品:

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

但隨着負數比較負數是... suprising:

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

這裏發生了什麼事情,所以我可以糾正我的直覺是什麼陣列比較意味着在JavaScript?

+0

參見[如何排列在JavaScript相比(HTTP: //stackoverflow.com/q/16566772/1048572)解釋行爲和[三維比較函數在Javascript中的數組](http://stackoverflow.com/q/23881838/1048572)解決方案 – Bergi

回答

21

的數組轉換到一個字符串,這個字符串歸結爲.join(),然後用逗號加上元素(,)作爲分隔符。

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

因爲字符碼的-(45)字符碼的0(48)小。

在另一方面,

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

因爲第二字符代碼進行比較(第一都是-,以便不給結果還),以及用於2的字符代碼(50)是1(49)的字符代碼大,所以這產生了false

即使元素是數字(由於字符串強制),它歸結爲詞法排序(即通過字符代碼)而不是數字排序。

不推薦基本上比較數組。它被隱式定義爲字符串比較,但是這可能會產生令人驚訝的結果。

+0

,'+ [ - 2] - + [ - 1];'應該這樣做。 – jAndy

+1

@jAndy:它會的,但它再次只適用於單元素陣列。 '-2 - 1'會更清晰一些...... – pimvdb

6

沒有類似於您所描述的任何形式的JavaScript數組比較。

在所有情況下發生的情況是,您的數組通過將它們的內容連接在一起首先轉換爲字符串。因此,字符串「-2」是而不是小於字符串「-1」,因爲字符「2」在字符集中出現在「1」之後。類似地,「-1,1」小於「0,0」,因爲「 - 」字符位於數字之前。

你可以看到自己,在所有情況下,你的比較:

array1 < array2 

得到完全相同的結果:

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

或:

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

我找不到任何有關如何在Javascript實際的比較陣列,並得到「預期」的結果一個答案,所以這裏是代碼

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 
相關問題