javascript数组方法sort返回120大于50

时间:2016-05-26 14:34:50

标签: javascript

以下代码对数组中的整数进行排序错误,结果如下:1,10,100,30,40,50,80

params

3 个答案:

答案 0 :(得分:3)

根据Array.prototype.sort的文档,“默认排序顺序是根据字符串Unicode代码点。”这将为您提供词法排序,您通常不需要数字。

具体来说,section 22.1.3.24.1ECMAscript spec定义了正常的排序函数,步骤5和7显式地将参数转换为字符串:

  
      
  1. xString为ToString(x)。
  2.   
  3. ReturnIfAbrupt(xString)。
  4.   
  5. yString为ToString(y)。
  6.   
  7. ReturnIfAbrupt(yString)。
  8.   
  9. 如果xString < yString,则返回-1。
  10.   
  11. 如果xString > yString,请返回1.
  12.   
  13. 返回+0。
  14.   

您应该提供自己的排序函数,不将值视为字符串,例如:

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

Working JSFiddle