javascript排序函数排序错误

javascript sort function sorting wrong

本问题已经有最佳答案,请猛点这里访问。

你好,我有一个文本框,它的值如下

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

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

我所做的。

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

当我检查阵列时

1
 console.log(allsortedValues);

它显示

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

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

我甚至用过

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

在应用sort之前,在其他情况下,我甚至使用了EDOCX1[1]like

1
2
3
4
for(var i = 0; i < allsortedValues.length; i++) {

   allsortedValues[i] = parseInt(allsortedValues[i]);
}

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


您必须传递一个Comparator函数,该函数将字符串转换为数字:

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

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

构造(+a)涉及一元+运算符,如果a已经是一个数字,它就不起任何作用。但是,如果a不是数字,那么当解释为数字时,+a的结果要么是a的值,要么是NaN的值。通过将字符串作为数字的字符串表示进行检查和分析,可以明显地将字符串解释为数字。布尔值将转换为false -> 0true -> 1。值null变为0undefined变为NaN。最后,一个对象引用通过调用它的valueOf()函数被解释为一个数字,否则NaN函数无效。

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


If compareFunction is not supplied, elements are sorted by converting
them to strings and comparing strings in lexicographic ("dictionary"
or"telephone book," not numerical) order. For example,"80" comes
before"9" in lexicographic order, but in a numeric sort 9 comes
before 80.

To compare numbers instead of strings, the compare function can simply subtract b from a:

1
2
3
4
function compareNumbers(a, b)
{
  return a - b;
}

https://developer.mozilla.org/en-us/docs/javascript/reference/global_objects/array/sort