首页 > 编程笔记
JS数组排序:sort()方法
JavaScript 数组中提供了 sort() 方法用于排序,还提供了 reverse() 方法用于反转数组的顺序。
如果没有给 sort() 传递参数,则会把元素转换成字符串,按字符串的 UTF-16 代码点进行升序排列,所以要注意数字类型的元素可能会跟预期结果不同,因为数字被转换成了字符串进行比较,代码如下:
请看下面的代码:
要注意的是不同的 JavaScrip t引擎(浏览器或 Node.js)对于 sort() 的实现方法不同,有的可能是快速排序,有的可能是归并排序,对于排序的时间复杂度或空间复杂度是不确定的,也就是说不能保证它的性能。
JS sort() 方法
对数组排序使用 sort() 方法,它会把数组进行原地排序,然后返回排序后的数组,它与原数组是同一个数组。如果没有给 sort() 传递参数,则会把元素转换成字符串,按字符串的 UTF-16 代码点进行升序排列,所以要注意数字类型的元素可能会跟预期结果不同,因为数字被转换成了字符串进行比较,代码如下:
["apple","banana","car","app"].sort(); //["app","apple","banana","car"] [82,71,99,4,10,120].sort(); //[10,120,4,71,82,99]可以看到第2个数组中,数字并没有按正常顺序排序,如果要对数字进行排序,则可以给 sort() 传递一个回调函数,回调函数接收两个参数,即两个需要比较的元素,假设第1个参数名为 a,第2个为 b:
- 如果想让 a 排在 b 前边,就需要回调函数返回一个负数;
- 如果让 a 排在 b 的后边就需要返回正数;
- 如果让 a 和 b 保持原来的位置,则返回0,不过不同的浏览器对于返回0的处理方式不同,有可能让 a 在前 b 在后,也有可能让 b 在前 a 在后。
请看下面的代码:
[82,71,99,4,10,120].sort((a,b)=>{ if(a>b)return 1; if(a<b)return-1; if(a===b)return 0; }); //[4,10,71,82,99,120]上方的代码可以简写成的代码如下:
[82,71,99,4,10,120].sort((a,b)=>a-b);因为当 a<b 时,a-b 一定是负数,当 a>b 时,a-b 肯定为正数,而当 a=b 时,结果为 0,这样就满足了正序排列的条件。如果要倒序排列数组,则可以返回 b-a。
要注意的是不同的 JavaScrip t引擎(浏览器或 Node.js)对于 sort() 的实现方法不同,有的可能是快速排序,有的可能是归并排序,对于排序的时间复杂度或空间复杂度是不确定的,也就是说不能保证它的性能。
JS reverse() 方法
如果想反转一个数组,即最后一个元素作为第1个元素,倒数第2个元素作为第2个元素,以此类推,则可以使用 reverse() 方法,它会原地反转数组并返回反转后的原数组,与 sort() 一样会修改原数组,代码如下:["h","e","l","l","o"].reverse(); //["o","l","l","e","h"]