sort()
方法用原地算法对数组进行 原位(in-place) 排序,更改元素的顺序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的
语法
arr.sort([compareFunction])
参数 :
compareFunction
可选
用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。
first
第一个用于比较的元素。
second
第二个用于比较的元素。
返回值:
返回排序后的数组,但是返回值通常会被忽略,因为修改了 arr
本身。请注意,数组已原地排序,并且不进行复制。
理解
如果没有指明 compareFunction
,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。例如 "Banana" 会被排列到 "cherry" 之前。当数字按由小到大排序时,9 出现在 80 之前,但因为(没有指明 compareFunction
),比较的数字会先被转换为字符串,所以在Unicode顺序上 "80" 要比 "9" 要靠前。
let arr = [ 1, 9, 80 ];
// 该方法重新排列 arr 的内容
arr.sort();
alert( arr ); // 1, 80, 9
如果指明了 compareFunction
,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:
- 如果
compareFunction(a, b)
小于 0 ,那么 a 会被排列到 b 之前;
- 如果
compareFunction(a, b)
等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
- 如果
compareFunction(a, b)
大于 0 , b 会被排列到 a 之前。 compareFunction(a, b)
必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。
function compare(a, b) {
if (a > b) return 1; // 如果第一个值比第二个值大
if (a == b) return 0; // 如果两个值相等
if (a < b) return -1; // 如果第一个值比第二个值小
}
arr可能包含数字、字符串、对象或其他任何内容。我们有一组 一些元素。要对其进行排序,我们需要一个 排序函数 来确认如何比较这些元素。默认是按字符串进行排序的。
要比较数字而非字符串,比较函数可以简单的以 a 减 b,如下的函数将会将数组升序排列
let arr = [ 1, 2, 15 ]; arr.sort(function(a, b) { return a - b; }); alert(arr); // 1, 2, 15 //箭头函数更加简洁 arr.sort( (a, b) => a - b );
对象可以按照某个属性排序:
let list = [ { id : 9, price : 10 , name : '苹果' }, { id : 21, price : 3.6 , name : '柚子' }, { id : 44, price : 40, name : '榴莲' } ] list.sort((obj1,obj2) => obj1.price-obj2.price ) console.log(list) //得到结果如下图
使用映射对字符串排序:
compareFunction
可能需要对元素做多次映射以实现排序,尤其当compareFunction
较为复杂,且元素较多的时候,某些compareFunction
可能会导致很高的负载。使用 map 辅助排序将会是一个好主意。基本思想是首先将数组中的每个元素比较的实际值取出来,排序后再将数组恢复。// 需要被排序的数组 let list = ['Delta', 'alpha', 'CHARLIE', 'bravo']; // 对需要排序的数字和位置的临时存储 let newList = list.map(function(el, i) { return { index: i, value: el.toLowerCase() }; }) // 按照多个值排序数组 newList.sort(function(a, b) { return +(a.value > b.value) || +(a.value === b.value) - 1; }); // 根据索引得到排序的结果 let result = newList.map(function(el){ return list[el.index]; }); console.log(result) //结果如下图