9

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

<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]);
}

在应用排序之前,但在所有情况下结果都是相同的。有人会指导我做错了什么吗?

4

2 回答 2

22

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

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

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

该构造(+a)涉及一元运算符,如果已经是一个数字+,它不会做任何事情。a但是,如果不是a数字,则结果将是当解释为数字时的值,或者是。通过检查和解析为数字的字符串表示,字符串以显而易见的方式被解释为数字。布尔值将被转换为和。值变为,并且是。最后,对象引用通过调用其函数被解释为数字,否则如果这没有帮助。+aaNaNfalse -> 0true -> 1null0undefinedNaNvalueOf()NaN

Number(a)如果您愿意,它等效于使用 Number 构造函数,如在 中。它的作用与+a. 我是一个懒惰的打字员。

于 2013-04-02T13:23:01.170 回答
12

如果未提供 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

于 2013-04-02T13:23:17.467 回答