2011-11-30 81 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 
相关问题