5

很难相信,但这看起来像是 Google Chrome 的 Javascript 引擎中的一个错误。我错过了什么吗?

Chrome Javascript 控制台会话:

> x = [10, 1]
> x.sort()
[1, 10]
> // OK.  But now try this.
> x = [10, 2]
> x.sort()
[10, 2]

它没有整理它!

我目前正在运行版本 24.0.1312.57 m

4

5 回答 5

11

array.sort()按字典顺序对数组进行排序。这意味着,数组的值被解释为字符串并像字符串(按字母顺序)排序,而不是整数。

这里也描述了这种行为:http ://www.javascriptkit.com/javatutors/arraysort.shtml

于 2013-02-26T08:12:13.003 回答
7

对于那些来这里弄清楚在 Chrome 中排序到底有什么问题的人,这里有一个例子unstable sorthttps ://jsfiddle.net/wujpw8bo/

如何修复它:

不稳定的排序算法可以专门实现稳定。这样做的一种方法是人为地扩展键比较,以便使用原始输入列表中条目的顺序作为决胜局来决定具有其他相同键的两个对象之间的比较。然而,记住这个顺序可能需要额外的时间和空间。 https://en.wikipedia.org/wiki/Sorting_algorithm#Stability

于 2017-01-11T06:23:57.500 回答
3

我认为 MDN 已经很好地解释了Source MDN Array.sort()

sort() 方法对数组的元素进行就地排序并返回该数组。排序不一定是稳定的。默认排序顺序是根据字符串Unicode 代码点

arr.sort([compareFunction])

比较函数 可选

  1. 指定定义排序顺序的函数。如果省略,则根据每个字符的 Unicode 码位值,根据每个元素的字符串转换对数组进行排序。
  2. 如果未提供 compareFunction,则通过将元素转换为字符串并按 Unicode 代码点顺序比较字符串来对元素进行排序。例如,“樱桃”出现在“香蕉”之前。在数字排序中,9 在 80 之前,但由于数字被转换为字符串,因此在 Unicode 顺序中,“80”在“9”之前。
var scores = [1, 10, 2, 21]; 
scores.sort(); // [1, 10, 2, 21]
// Watch out that 10 comes before 2,
// because '10' comes before '2' in Unicode code point order.

要比较数字而不是字符串,比较函数可以简单地从 a 中减去 b。以下函数将对数组进行升序排序:

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

例子:

function compareNumbers(a, b) {
  return a - b;
}
var scores = ['1', '010', '200', '110']; 
scores.sort(compareNumbers);

O/P:数组[“1”、“010”、“110”、“200”]

于 2015-09-20T21:59:19.677 回答
1

您应该使用以下方法:

abc =[10,2,4,1]; abc.sort(function( a , b ){
  return a-b;
});

http://www.w3schools.com/jsref/jsref_sort.asp

于 2013-02-26T08:07:05.880 回答
-1

您的第二次sort()缺少括号

x.sort()

编辑: 我自己试过了,即使有括号也不起作用。

检查这些问题。也许他们会解决你的问题。

在 Chrome 中对对象数组进行排序

用 Chrome 对 Javascript 数组进行排序?

Edit2: 这按预期工作:

var x;
x = [10, 2]; 
alert(x); // returns 10, 2
x.sort ( function( a , b ){
  return a-b;
});
alert(x); // returns 2,10
于 2013-02-26T07:57:30.803 回答