javascript令人惊讶的数组比较

时间:2011-11-30 15:58:12

标签: javascript arrays comparison

我正在尝试比较javascript中的两个数组。

我想要的是:

  

a&lt; b⇔∃i≥0s.t。 a [i]&lt; b [i]和∀0≤j<我,a [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中数组比较意味着的直觉?

3 个答案:

答案 0 :(得分:22)

将数组转换为字符串,该字符串结果为.join(),后者又以逗号(,)作为分隔符连接元素。

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

因为-(45)的字符代码小于0(48)的字符代码

另一方面,

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

因为比较了第二个字符代码(第一个是-,所以还没有给出结果),2(50)的字符代码是更大而不是1(49)的字符代码,因此这会产生false

归结为词法排序(即通过字符代码),而不是数字排序,即使元素是数字(因为字符串强制)。

基本上不建议比较数组。它被隐式定义为字符串比较,但这可以产生令人惊讶的结果。

答案 1 :(得分:7)

没有任何形式的JavaScript数组比较与您描述的类似。

在所有情况下发生的事情是,通过将数组连接在一起,您的数组首先被转换为字符串。因此,字符串“-2”小于字符串“-1”,因为字符“2”在字符集中位于“1”之后。类似地,“-1,1”小于“0,0”,因为“ - ”字符位于数字之前。

在所有情况下,你都可以看到你的比较:

array1 < array2

获得完全相同的结果:

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

或:

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

答案 2 :(得分: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