了解Javascript .sort参数

时间:2013-02-17 23:09:36

标签: javascript arrays function sorting

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

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. 如何填充ab

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

  3. 如果该功能一次仅检查2个数字,那么所有数字如何分类到正确的顺序? (即ab

3 个答案:

答案 0 :(得分:6)

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

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

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

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

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

答案 1 :(得分:3)

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

  1. 如何填充ab - 欢迎来到函数式编程的世界。数组在内部迭代,并使用(第一个元素)和b(第二个元素)调用回调函数,直到元素用完为止。你不必过于担心这一点,只要知道发生了什么。

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

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

答案 2 :(得分:0)

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

Here's a link to the specification.这很令人困惑,但关键在于排序比较过程的描述结束。