sort()方法

语法:arr.sort(compareFunction)

compareFunction可选,用来指定按某种顺序进行排列的函数。

sort()方法会把数组中元素转换为字符(调用toString()方法),根据每个字符Unicode位点进行排序。

1
2
3
var values = [0, 1, 5, 10, 15];
values.sort();
alert(values); // 0, 1, 10, 15, 5

比较函数接受两个参数,若第一个参数小于第二个参数则返回负数;若第一个参数等于第二个参数则返回整数;若第一个参数大于第二个参数则返回整数。一个比较函数的例子:

1
2
3
4
5
6
7
8
compareFunction(a, b) {
if (a < b) return -1;
else if (a > b) return 1;
else return 0;
}
values.sort(compareFunction);
alert(values); // 0, 1, 5, 10, 15

当 compareFunction 较为复杂,使用 map 辅助排序将会是一个好主意。基本思想是首先将数组中的每个元素比较的实际值取出来,排序后再将数组恢复。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 需要被排序的数组
var list = ['Delta', 'alpha', 'CHARLIE', 'bravo'];
// 对需要排序的数字和位置的临时存储
var mapped = list.map(function(el, i) {
return { index: i, value: el.toLowerCase() };
})
// 按照多个值排序数组
mapped.sort(function(a, b) {
return +(a.value > b.value) || +(a.value === b.value) - 1;
});
// 根据索引得到排序的结果
var result = mapped.map(function(el){
return list[el.index];
});

最后要说的是JavaScript数组中使用的排序算法是in-place类型的,为了节省内存,是不稳定的,因为基于非相邻元素比较的排序算法都是不稳定的。