以下代码对数组中的整数进行排序错误,结果如下:1,10,100,30,40,50,80
params
答案 0 :(得分:3)
根据Array.prototype.sort的文档,“默认排序顺序是根据字符串Unicode代码点。”这将为您提供词法排序,您通常不需要数字。
具体来说,section 22.1.3.24.1的ECMAscript spec定义了正常的排序函数,步骤5和7显式地将参数转换为字符串:
- 让
xString
为ToString(x
)。- ReturnIfAbrupt(
xString
)。- 让
yString
为ToString(y
)。- ReturnIfAbrupt(
yString
)。- 如果
xString < yString
,则返回-1。- 如果
xString > yString
,请返回1.- 返回+0。
醇>
您应该提供自己的排序函数,不将值视为字符串,例如:
var arr = new Array();
arr = [50, 100, 30, 40, 80, 10, 1];
var z = arr.sort(function(a, b) {
if (a < b) return -1;
if (b < a) return +1;
return 0;
});
console.log(z);
答案 1 :(得分:1)
这是因为它将它们排序为字符串而不是数字。来自docs:
如果未提供
compareFunction
,则会通过将元素转换为字符串并按Unicode代码点顺序比较字符串对元素进行排序。例如,&#34; Banana&#34;来到&#34; cherry&#34;之前。在数字排序中,9出现在80之前,但由于数字被转换为字符串,&#34; 80&#34;来之前&#34; 9&#34;按Unicode顺序。
您需要做的是给它一个回调来将它们排序为数字:
arr.sort(function(a, b){
return a - b;
});
答案 2 :(得分:0)
sort()
方法对数组的项进行排序。
排序顺序可以是字母顺序或数字顺序,也可以是升序(向上)或降序(向下)。
默认情况下,sort()方法按字母顺序和升序将值排序为字符串。
这适用于字符串("Apple" comes before "Banana")
。但是,如果数字按字符串排序,&#34; 25&#34;大于&#34; 100&#34;,因为&#34; 2&#34;大于&#34; 1&#34;。
因此,sort()方法在排序数字时会产生错误的结果。
你可以通过提供一个&#34;比较功能来解决这个问题。 :array.sort(compareFunction)
var points = [50, 100, 30, 40, 80, 10, 1];
points.sort(function(a, b){return a-b});
console.log(points);
o/p: 1,10,30,40,50,80,100