开门见山,让我们先看一段代码:
// 定义一个数组
let arr = [18, 64, 78, 99, 32, 2];
// 使用sort()进行排序
let result = arr.sort();
// 输出
console.log(result);
输出的结果:
这时候,英语好的同学就会有疑问:“sort不是排序的意思吗?为什么答案既不是降也不是升序呢?”
我们知道其实计算机底层是和0/1打交道的,我们看到的文本里会包含有数字、字符还有符号。那么计算机要处理这些文本就需要转换为0/1才能进行处理,每个国家都有不同的语言和符号,于是就有了Unicode来进行统一,我们的主角sort()方法就是根据utf-16代码单元序列进行排序的。
众所周知的是,在调用sort()方法时会对数字进行字符串的转换,这样就可以按照Unicode编码表进行排序了。在排序的过程中,sort()方法将数字转换为字符串,之后从左到右一个字符一个字符的进行对比。sort()方法就是这样对字符进行升序排序。
那么问题来了,如何才能让数字正确的进行升序或降序排序呢?
上代码!
// 定义一个数组
let arr = [18, 64, 78, 99, 32, 2];
// 使用sort()进行排序
let result = arr.sort(function (x, y) {
console.log(`${x} - ${y} = ${x - y}`);
return x - y;
});
console.log(arr);
运行结果:
从上述结果我可以看出,sort()方法是将数字从左到右两两进行对比,在函数内传入x,y两个参数。可以看到顺序是后面一个数减去前面一个数,知道x,y的顺序之后,就可以了解排序的原则了。在函数内添加x-y的返回值,数组顺序就变为正确的数字升序。可以看出只要顺序还没有排好,底层已经有很好的算法将它们对比并排序好为止。
官方规定的三种排序原则:
- 当function(x, y)得到的返回值小于0时,x会被移动到y前面。
- 当function(x, y)得到的返回值大于0时,x会被移动到y后面。
- 当function(x, y)得到的返回值等于0时,x与y的位置相对不变,但不是所有浏览器都遵守这个规则。
因此我们能看出,x实际上是后面那个元素,而y则是前面那个元素,这样就比较好理解了。
设置返回值时:
- x - y < 0,就说明x比y要小,小的数字会被移动到前面,所以最后的结果就是升序排序。
- x - y > 0,就说明x比y要大,大的数字在前面,也就是降序排序。
总结:
当你需要输出升序排序时,return x - y
当你需要输出降序排序时,return y - x
上述数组升序/降序的输出结果:
升序:
降序: