1. 前言:
一直以来,对sort()方法的使用都仅仅停留在array.sort()这一步,今天看了《javascript高级程序设计》第五章 5.2.5重排序方法这一节时,对sort()方法的相关介绍看的不太明白,因此决定对sort()方法进行深入的学习。下面是我学习的总结。
2. 语法:
array.sort(sortfunction)
sortfunction:可选规定排序顺序。必须是函数。
3. 不使用参数
在不使用参数情况下,sort()方法按升序排列数组项。sort()方法会先调用每个数组项的toString()方法,然后按照字符编码的顺序进行排序。
实例 1
<script> var arr = new Array('东方云游','阿红' ,'小明','a','B'); arr.sort(); console.log(arr); //["B", "a", "东方云游", "小明", "阿红"] </script>
实例 2
<script> var values = [0, 1, 3, 5, 7, 10, 15, 36]; values.sort(); console.log(values);//[0, 1, 10, 15, 3, 36, 5, 7] </script>
如实例2所示,即使字符串中的数值全部都是数字,但sort()方法也同样会按照转化为字符串之后的值进行比较。
4. 使用参数
如果想要按照其他标准进行排序,就需要提供比较函数,该函数返回一个用于说明这两个值相对顺序的数字。比较函数应该具有两个参数a和b,其返回值如下:
- 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
- 若 a 等于 b,则返回 0。
- 若 a 大于 b,则返回一个大于 0 的值。
实例3
<script> function sortNum(a,b) { return a - b; } var values = [0, 1, 3, 5, 7, 10, 15, 36];
values.sort(sortNum); console.log(values);//[0, 1, 3, 5, 7, 10, 15, 36] </script>
如上在使用了sortNum函数之后,就可以返回正确的值了,如果想进行降序排列只需要 return b-a 就可以了。sortNum函数只能用于数值类型,或者valueOf()方法返回数值类型的对象类型。
实例 4
<script> function compare(x, y) { return x < y ? -1 : x > y ? 1 : 0; } var letters = ["L", "o", "V", "e"]; letters.sort(compare); console.log(letters);//["L", "V", "e", "o"] 在字符编码中大写字母在小写字母前面 var nums = [1, 3, 5, 8, 13, 46, ]; nums.sort(compare); console.log(nums);//[1, 3, 5, 8, 13, 46] </script>
上例中的compare函数适用于大多数的数据类型。要降序的话只要把x<y改成x>y就行了。
5. 多维数组
如果a和b本身就是数组,这个时候我们就需要通过对它们内部的值比较来对数组进行排序了。
实例 5
<script> function sortArr(a, b) { return a[0] - b[0];
} var students = [ [1, '东方云游'], [8, '乔布斯'], [4, '比尔盖茨'], [12, '马云'] ] students.sort(sortArr); </script>
6. 多重比较
当第一个比较值相等,但是我们还想进行再次区分的时候,可以使用第二比较值,并且比较的深度可以随着我们的需求扩展。
实例 6
<script> function sortArr(a, b) { if (a[0] == b[0]) { return a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0; } return a[0] - b[0]; } var students = [ [1, '东方云游'], [4, '乔布斯'], [4, '比尔盖茨'], [4, '马云'] ] students.sort(sortArr); </script>
如上例学生数组所示,当学号相同时,这我们就需要用学生的名字进行再次排序。
7. 对象排序
当比较的数据越来越复杂的时候,我们最好使用对象进行排序。这样我们就能够从代码上看出来是使用什么值来进行比较的了。
<script> function compare(a, b) { return a.age - b.age } var employees = [] employees[0] = { name: "George", age: 32, retiredate: "March 12, 2014" } employees[1] = { name: "Edward", age: 17, retiredate: "June 2, 2023" } employees[2] = { name: "Christine", age: 58, retiredate: "December 20, 2036" } employees[3] = { name: "Sarah", age: 62, retiredate: "April 30, 2020" } employees.sort(compare); </script>