这也是一般情况下建议的方式,因为不知道不同的 js 引擎在不传递排序函数的时候,会按照什么方案进行排序。
例如:
代码如下 | 复制代码 |
var colors = ['red', 'green', 'blue', 'yellow', 'white']; console.log(colors.sort()); // ["blue", "green", "red", "white", "yellow"] console.log(colors); // ["blue", "green", "red", "white", "yellow"] |
如果不传递排序函数,那么,对于字符串来说,其将按照字母顺序来进行排序,可是,如果这些字符串里面有大写小写字母混合呢?
代码如下 | 复制代码 |
var colors = ['red', 'green', 'blue', 'Yellow', 'White']; console.log(colors.sort()); // www.111cn.net ["White", "Yellow", "blue", "green", "red"] |
怎么样,结果不一样了吧?这是因为此时按照 ASCII 编码的顺序进行排序了。
同时,另一个问题是,sort 函数作用于原数组,也即是排序的结果会覆盖排序前的数组。
然后,对于数字数组,不传递排序函数的话,会是什么结果呢?
代码如下 | 复制代码 |
var money = [12, 3, 7.4, 200]; console.log(money.sort()); // [12, 200, 3, 7.4] |
咦?并没有得到预期的结果(除非你的预期不是按数字大小),那么为什么呢?
因为在 sort 排序的时候,如果不传递排序函数,那么会先将所有的元素转换为 字符串 ,然后才会一个字一个字(ASCII,对于 true 或者 false 这类型的值都是一样的)的排序,为什么都转换成字符串,因为 JavaScript 数组中可以是任意类型的数据,所以 JavaScript 无法推断到底转换为什么类型去排序。
那么我们看看不同的数据类型,排序函数的一些写法:
数组内都是数字,或者期望按数字为主的排序方式。
代码如下 | 复制代码 |
var money = [12, 3, 7.4, 200]; var compare = function(a, b) {return a - b;}; console.log(money.sort(compare)); // [3, 7.4, 12, 200] //console.log(money.sort(function(a, b) {return a - b;})); // [3, 7.4, 12, 200] |
这是最基础的排序函数,任何讲到 JavaScript 排序的地方,基本都会讲这个。首先取前两个元素赋值给 a b,返回 a-b 的值,如果返回负值则 a 在 b 前,等于 0 则无所谓,因为两个元素相等,返回正直,则 a 在 b 后。
对于字符串的元素来说,和数字的差不多,无非就是不同的排序函数,那如果是对象呢?
代码如下 | 复制代码 |
var people = [ { name: 'Alice', id: 1234 }, { name: 'Bob', id: 567 } ]; var compare = function(a, b) {return a.id - b.id;} console.log(people.sort(compare)); // Bob is before Alice now |
对于元素的排序函数传递的参数都一样,两个数组中的元素,然后此处主要比较两个对象元素的 id 的值,来进行排序的。
可是如果如下面这种情况呢?
代码如下 | 复制代码 |
var everything = [4, 'Red', '$200', 'white', 7.4, 12, true, 0.3, false]; var compare = function(a, b) {return a - b;}; console.log(everything.sort(compare)); |
当排序函数进行计算的时候,由于有减法运算的参与,所以这里都会先转成数字进行计算的,但是如果是字符串的话,此处就会转换为 NaN,因为在 ECMA 规范中没有明确定义这时候应该如何进行排序,所以各个平台,也就是各个浏览器(JavaScript环境)的不同,导致最终的结果会不一定相同。大家可以自己在不同的浏览器上测试下。
下面放几个自己用的sort排序例子
代码如下 | 复制代码 |
<html> <head> <title>数组的sort()方法</title> <script> /* sort() 1、没有产生副本,直接引用原数组 2、如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序, 说得更精确点,是按照字符编码的顺序进行排序。 要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。 3、如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值, </head> </html> |