5

我无法理解为什么以下函数对字符串进行数字排序(在代码的第三部分)。

var myArray = [10, 44, 32, 100, 0, 44, 3, 4];
console.log(myArray.toString()); // 10, 44, 32, 100, 0, 44, 3, 4 --> unsorted

myArray.sort();
console.log(myArray.toString()); // 0,10,100,3,32,4,44,44 --> sorted like strings

// this is what confuses me:
myArray.sort(function (a, b) {
return a - b;
});
console.log(myArray.toString()); // 0,3,4,10,32,44,44,100 --> sorted numerically

具体来说

  1. 如何a获得b人口?

  2. 为什么减法a - b按数字顺序对数字进行排序?

  3. 如果函数一次只检查 2 个数字,如何将所有数字按正确的顺序排序?(即ab

4

3 回答 3

9

.sort接受一个可选参数,它应该是一个函数。

.sort然后重复调用该函数,将数组中的一对值(ab参数)传递给它。然后该函数返回一个值,其解释如下:

  • 如果返回值小于 0,则a < b
  • 如果返回值大于 0,则a > b
  • 如果返回值正好是 0,那么a == b

使用它,.sort使用浏览器编程使用的任何排序算法来计算项目的顺序。

在没有排序功能的情况下,.sort会将项目排序为字符串——这只是设计的任意点。理想情况下,您应该传递一个要在任何时候使用的函数.sort,就像这里函数强制将值作为数字进行比较的情况一样。

于 2013-02-17T23:13:51.497 回答
3

无论出于何种原因(我应该找到文档),默认行为Array.prototype.sort是按字符串排序,而不是按数字排序。这意味着您必须定义数字排序行为。

  1. 如何做ab得到填充- 欢迎来到函数式编程的世界。数组在内部进行迭代,并使用 a(第一个元素)和 b(第二个元素)调用回调函数,直到元素耗尽。你不必太担心这一点,只要知道这就是发生的事情。

  2. 幸运的是,这方面的文档非常清楚。如果回调的返回值小于 0,a则索引低于b. 如果0返回,则将它们保持在相对于其他元素的相同索引处。如果返回正值,b则索引低于a。这意味着a - b保证可以正常工作以进行数字排序。 但是,如果有任何非数字元素,您将遇到此回调函数的问题。仅当您知道数组仅包含数字元素时才使用它。

  3. 这是一个简单的插入排序,实际上不会一次进行两个,但如果b恰好小于a. console.log(a,b)您可以通过将 a 添加到排序回调方法来检查此行为。

于 2013-02-17T23:16:44.490 回答
0

默认情况下, JavaScript.sort()函数总是对数组进行排序,就好像它们的内容是字符串一样。这就是它的作用。基本上,默认排序函数.toString()对每个值执行 a 。

这是规范的链接。这很令人困惑,但关键是在排序比较过程描述的末尾。

于 2013-02-17T23:11:35.597 回答