对于sort()
,MDN是这样说的:sort()
方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的。
由于它取决于具体实现,因此无法保证排序的时间和空间复杂性。简单的来讲,如果直接使用,可能结果并不是我们所期望的。例如:
var arr = [2,3,13,17,4,19,1];
arr.sort() // 结果:[1, 13, 17, 19, 2, 3, 4]
我们发现并没有按照从小到大进行排序,但是sort()
方法提供了比较函数作为参数,是用来指定按某种顺序进行排列的函数。具体如下:
语法:
arr.sort([compareFunction])
参数:
compareFunction
任选
firstEl
: 第一个用于比较的元素。
secondEl
: 第二个比较的元素。
描述:
指明了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)
必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。
从解释看,还是比较模糊,下面我们直接看实例:
// 升序
var numbers = [4, 2, 5, 1, 3];
numbers.sort((a, b) => a - b);
console.log(numbers);// [1, 2, 3, 4, 5]
// 降序
var numbers = [4, 2, 5, 1, 3];
numbers.sort((a, b) => b - a);
console.log(numbers);// [5, 4, 3, 2, 1]
// 可以根据某个属性对对象数组进行排序
var items = [
{ name: 'Edward', value: 21 },
{ name: 'Sharpe', value: 37 },
{ name: 'And', value: 45 },
{ name: 'The', value: -12 },
{ name: 'Magnetic' },
{ name: 'Zeros', value: 37 }
];
items.sort((a,b) => {
return a.value - b.value
});
/**
[
{
"name": "The",
"value": -12
},
{
"name": "Edward",
"value": 21
},
{
"name": "Sharpe",
"value": 37
},
{
"name": "And",
"value": 45
},
{
"name": "Magnetic"
},
{
"name": "Zeros",
"value": 37
}
]
**/
又到了总结的时候:
在工作中,用的最多的就是对数据的排序,无非就是升序跟降序了。记住的方法就是:
a - b
,a
在前升序,b - a
,b
在前降序