javascript sort函数探究

96
kuulid
2017.12.05 21:54 字数 520

有一个常见问题:如何给一个对象数组排序?如下代码

let arr = [{
    name: 'w',
    scores: 90
}, {
    name: 'w',
    scores: 60
}, {
    name: 'w',
    scores: 100
}];

一般js老司机都知道这样写:

arr.sort(function(a, b) {
    return a.scores - b.scores;
});

但是为什么这样呢,s是用什么排序原理,为什么需要一个这个函数。MDN的解释稍微明白一些

compareFunction
可选。用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的诸个字符的Unicode位点进行排序。

如果指明了 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) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

其实ECMAscript并没有规定js sort函数的具体排序算法,网上有些人说是冒泡排序也是错的,ECMAscript只规定了这个compareFunction函数, 函数接受两个被比较的值,默认两个值相减,从小到大排序,但也可以像上述解决办法一样人为规定相减的key值。

换个角度看,如果这个函数一直返回负数,则数组不变,如果返回负数,则数组逆序,不论大小,如下结果:


正序或逆序

所以有个问题,js如何打乱一个数组,就让这个函数返回不确定的正数或负数,即:

a.sort(function() {return 0.5 - Math.random()})

至于js真正使用的排序算法,可以参考以下回答
https://stackoverflow.com/questions/234683/javascript-array-sort-implementation

前端
Web note ad 1