开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情
关键词:sort()、升序排列、降序排列、自定义排序
按照正常思维,当提到排序元素时第一时间想到大概率是将不确定元素顺序的数组从小至大(升序) 依次排列,使用sort() 函数;如此同时,既然可以升序排列, 那么自然就可以降序排列,如下:
let array = [4, 2, 1, 5, 3]
console.log(array.sort()); // result:[ 1, 2, 3, 4, 5 ]
console.log(array.reverse()); // result:[ 5, 4, 3, 2, 1 ]
注意,这个有坑:
当你觉得可以sort()函数在升序排列这条路杀穿时,那可能出门就要打脸,抛开其他可以排序方法不谈(因为还不会),仅仅用上面的方法,新手村的都出不去,因为来个两位数就应付不过来了,跑个栗子:
let numbers = [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
console.log(numbers.sort());
// result:[1, 10, 11, 12, 13, 14,15, 2, 3, 4, 5, 6,7, 8, 9]
什么玩一,我要的升序排列呢?why ???
猫一眼文档: Array.prototype.sort()
sort() 方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列时构建的
划重点:
- 将元素转化为字符串
- UTF-16 代码单元值序列(参考:略)
怎么办,整个项目就这一处需要对数组进行排序,还需要手动封装一个排序函数(冒泡排序 | 选择排序 | 插入排序 | 希尔排序 | 归并排序 | 快速排序 | 堆排序 | 计数排序 | 桶排序 | 基数排序)吗?(十大经典排序算法),当然可以,但是sort()也不能干看着,所谓存在及合理,有pro进阶用法,栗子如下:
let numbers = [15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
console.log(numbers.sort((a, b) => a - b));
// result:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
这样写的目的在于sort方法可以接收一个可选的函数作为参数,就是文档中提到的compareFn ,而这个比较函数需要接收连个参数,a和b,返回值如下,更多用法可参考上面给出的文档,这个就不过多重复了,否则就显得不礼貌了
| compareFn(a, b) 返回值 | 排序顺序 |
|---|---|
| > 0 | a 在 b 后 |
| < 0 | a 在 b 前 |
| === 0 | 保持 a 和 b 的顺序 |
至此,我们就可以大刀阔斧的继续肝下去了,而不用担心排序是发生意外
所谓前人栽树后人乘凉,当你使用得心应手的使用前辈封装好排序函数时,有没有想过前辈们时如何实现的,及sort()的底层用的那种排序算法?和其他的排序算法相比如何,如果感兴趣的话不妨看一下百度出来的这两个大佬写的文章:
当然了,更多关于sort的用法不止于此,这里不做一一列举了,都在文档里了,如果没有请仔细再阅读一边文档,还是没有请熟读并背会文档,解题之道就在其中。
冷知识;
查阅MDN文档时可以将文末的参见部分作为拓展阅读,无论时当前文章的理解还是视野的拓展都大有脾益。