我无法理解为什么以下函数以数字方式对字符串进行排序(在代码的第三部分中)。
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
具体:
如何填充a
和b
?
为什么减去a - b
按数字顺序对数字进行排序?
如果该功能一次仅检查2个数字,那么所有数字如何分类到正确的顺序? (即a
和b
)
答案 0 :(得分:6)
.sort
接受一个可选参数,该参数应该是一个函数。
.sort
然后重复调用该函数,从数组中传递一对值(a
和b
参数)。然后该函数返回一个值,其解释如下:
a < b
a > b
a == b
使用此功能,.sort
使用浏览器编程使用的任何排序算法计算项目的顺序。
如果没有排序功能,.sort
会将项目排序为字符串 - 这只是设计中的任意一点。理想情况下,您应该传递一个函数,以便在需要.sort
时使用,就像这里函数强制将值作为数字进行比较一样。
答案 1 :(得分:3)
无论出于何种原因(我应该找到文档),Array.prototype.sort
的默认行为是按字符串排序,而不是数字排序。这意味着您必须定义数字排序行为。
如何填充a
和b
- 欢迎来到函数式编程的世界。数组在内部迭代,并使用(第一个元素)和b(第二个元素)调用回调函数,直到元素用完为止。你不必过于担心这一点,只要知道发生了什么。
幸运的是,documentation很清楚。如果回调的返回值小于0,则a
的索引低于b
。如果返回0
,请将它们保持在相对于其他元素的相同索引处。如果返回正值,则b
的索引低于a
。这意味着a - b
可以保证在数字排序中正常工作。 然而 ,如果有任何非数字元素,您将遇到此回调函数的问题。只有在知道数组只包含数字元素的事实时才使用它。
这是一个简单的插入排序,实际上不是一次两个,但如果b
恰好小于a
,则会回溯。您可以通过向排序回调方法添加console.log(a,b)
来检查此行为。
答案 2 :(得分:0)
默认情况下,JavaScript .sort()
函数总是对数组进行排序,就好像它们的内容是字符串一样。这正是它的作用。基本上,默认排序函数对每个值执行.toString()
。
Here's a link to the specification.这很令人困惑,但关键在于排序比较过程的描述结束。