Heim > Fragen und Antworten > Hauptteil
想要按照从小到大的顺序排列
var numbers = [0,1,5,10,15];
numbers.sort();
console.log(numbers);
打印出来是0,1,10,15,5
书中说的是字符串比较下,10在5的前面,这是怎么比较的???
function compare(a,b) {
if (a < b) {
return -1;
}else if(a > b) {
return 1;
}else{
return 0;
}
}
numbers.sort(compare);
console.log(numbers);
比较函数作为参数传递给sort()之后,是怎么让2个数字换位置排列的?不清楚调换位置的动作是哪行代码执行的,难道是sort()本身可以对返回值1,-1, 0做相应的动作让两个数字调换位置吗?
怪我咯2017-04-10 16:01:54
关于第一次排序的结果
为什么数组 [0,1,5,10,15].sort() 之后的结果是 0,1,10,15,5,而不是期待的 0,1,5,10,15
这是因为 sort 方法默认(即没有compare函数)按照数组元素对应的字符串的 Unicode 从小到大进行排序。
也就是说,上面的结果中5排在10,15后面,是因为 '5' 比 '10','15'大。
你现在就可以按F12打开console,输入下面的代码
'5' > '10'
结果应该是true。这说明,字符串 '5' 比 '10' 大,所以它排在后面。
关于compare函数
compare函数只是指定了 排序策略 ,sort 会根据这个策略来排序。 至于怎么调换位置,怎么生成最后的结果,那是sort的事情。这里其实是一个常见的设计模式,策略模式。有兴趣可以去了解一下。
PHP中文网2017-04-10 16:01:54
位置互换是在sort内部执行的,传入的compare参数只是(一个返回1,-1, 0的)函数而已,compare返回值是在sort内部被使用的
天蓬老师2017-04-10 16:01:54
JS高级程序设计?哈哈,刚好前段时间看了这个。
问题1上面已经解答了,我补充一下问题2。
compare作为sort()的参数返回三个结果:0、1、-1。即0、正数、负数。就像你说的“sort()本身可以对返回值1,-1, 0做相应的动作让两个数字调换位置”,这里是sort()得到的参数为正数时才交换两个值的顺序,否则不交换。
巴扎黑2017-04-10 16:01:54
我今天也读到这里百思不得其解,主要不明白compare函数的意思。
搜索了一番后,终于明白了,这个原来与冒泡排序(Bubble Sort)机制相关。
参考 wiki 的说法是:
冒泡排序(Bubble Sort,)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。