javascript排序函数排序错误

时间:2013-04-02 13:21:27

标签: javascript sorting

您好我有一个文本框,其值为

<input type="hidden" value="2,1,4,5,3,6,7,8,9,10,11,12" class="sortvalues" id="1_1_parent">

现在我想要获取此文本框的值,想要将值拆分为数组,然后作为最后的结果我需要一个已排序的数组。

我做了什么。

 allsortedValues =  $(".sortvalues").val();
 allsortedValues = allsortedValues.split(",");
 allsortedValues = allsortedValues.sort();

当我检查数组时

 console.log(allsortedValues);

显示

  1,10,11,12,2,3,4,5,6,7,8,9

将数组排序为1, 10, 11, 12, 2.....

我甚至用过

allsortedValues = allsortedValues.split(",").map(function(x){return parseInt(x)});

在应用排序之前,在其他情况下,我甚至使用parseInt之类的

for(var i = 0; i < allsortedValues.length; i++) {

   allsortedValues[i] = parseInt(allsortedValues[i]);
}
在应用排序之前

但在所有情况下结果都相同。有人会指导我做错了吗?

2 个答案:

答案 0 :(得分:15)

你必须传入一个比较器函数,将字符串转换为数字:

allsortedvalues = allsortedvalues.sort(function(a,b) {
  return (+a) - (+b);
});

如果您的某些数组条目可能不是格式良好的数字,那么您的比较器必须变得更加复杂。

构造(+a)涉及一元+运算符,如果a已经是数字,它就不会执行任何操作。但是,如果a 是一个数字,那么当{em>解释为数字时,+a的结果将为a的值,或者NaN。通过检查和解析为数字的字符串表示形式,字符串以明显的方式解释作为数字。布尔值将转换为false -> 0true -> 1。值null变为0undefinedNaN。最后,通过调用valueOf()函数将对象引用解释为数字,如果没有帮助,则将其解释为NaN

如果您愿意,它等同于使用Number构造函数,如Number(a)中所示。它与+a完全相同。我是一个懒惰的打字员。

答案 1 :(得分:10)

  

如果未提供compareFunction,则通过转换对元素进行排序   它们是字符串并比较字典中的字符串(“字典”   或“电话簿”,而不是数字)命令。例如,“80”来了   在字典顺序中的“9”之前,但是数字排序9来了   80之前。

     

要比较数字而不是字符串,比较函数可以简单地从a:

中减去b
function compareNumbers(a, b)
{
  return a - b;
}

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort