我们都知道js中数组的sort方法,他可以对数组进行排序。具体的排序依据这里不多赘述想要了解的请锁定目标按下F键...哦不,请点击传送门。(此门内包含JS十八般武艺)
sort方法可以选填一个参数,这个参数是个函数,它定义了排序的规则。我们先来看不定义排序规则的sort使用案例。
var arr = [10, 5, 40, 25, 1000, 1]
arr.sort()
console.log(arr) // [ 1, 10, 1000, 25, 40, 5 ]
这里定义了一个数组 arr,我想用sort方法对他进行排序。本以为会从小到大排序,结果却并不是想象的那样。因为你并没指定排序规则,那么那么元素会按照它转换为的字符串的诸个字符的Unicode位点进行排序。例如 "Banana" 会被排列到 "cherry" 之前。当数字按由小到大排序时,9 出现在 80 之前,但因为(没有指明 compareFunction
),比较的数字会先被转换为字符串,所以在Unicode顺序上 "80" 要比 "9" 要靠前。 ——这段话摘自传送门。
那么我们就明白了,就像骑马,要想驾驭一匹马,先要配上鞍绳。那就来定义排序规则。
function sortNumber(a, b)
{
return a - b
}
var arr = [10, 5, 40, 25, 1000, 1]
arr.sort(sortNumber)
console.log(arr) //[ 1, 5, 10, 25, 40, 1000 ]
拿到了想要的结果。重点看一下sortNumber这个函数。里边只有一句‘return a - b’。
如果指明了 排序函数,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:
- 如果
sortNumber(a, b)
小于 0 ,那么 a 会被排列到 b 之前;
- 如果
sortNumber(a, b)
等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
- 如果
sortNumber(a, b)
大于 0 , b 会被排列到 a 之前。 sortNumber(a, b)
必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。
以上摘自传送门。
所以想了解sort的前世今生请速去传送门。
我改了一下sortNumber函数。
function sortNumber(a, b)
{
console.log(a, b)
return a - b
}
var arr = [10, 5, 40, 25, 1000, 1]
arr.sort(sortNumber)
因为我想看一下sort到底是怎样排序的。打印结果:
果然算法还是重要的。