我正在尝试比较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中数组比较意味着的直觉?
答案 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