w3school上对sort()用法的定义为:arrayObject.sort(sortby)
;
顾名思义 :排序对象.排序(排序方法)
arrayObject
直接 跳过了。sort
详解也暂时先跳过,我略看了下源码,对于arrayObject
的排序并不是单独使用的一种,个数少的时候用的插入排序,个数多的时候用的快速排序。
直接说 sortby
的用法。
sortby 是一个 返回函数 ,表示排序的依据,
它有俩个参数,分别为需要比较的俩个数(机器的排序是通过俩俩比较来进行排序的),
基本用法 :function(a,b){return a与b的比较结果}
sortby 会根据返回值 正数/0/负数 来进行排序。正数会顺序颠倒,负数和0顺序不动。
简单的数字排序:
先讲下浅层次的原理:
比如说 [1,2].sort((a,b)=>a-b)
这个比较只有一次 1和2 比较,代入函数,sortby返回值 为 -1 ,那么 1和2 顺序不变。
如果反过来[1,2].sort((a,b)=>b-a)
sortby返回值为1 ,那么1和2 的顺序就变了。
总结下也用法:
从小到大排序 array.sort((a,b)=>a-b)
;
从大到小排序:array.sort((a,b)=>b-a)
;
复杂点的Json排序。
这个有点类似于dataTable
中的排序。
我平时创建一个数据表的时候,也都是通过json数组 遍历创建的。
比如说:let data = [{name: 'a',age:14},{name: 'd',age:10},{name: 'c',age:32},{name: 'b',age:5}]
;
首先通过name来排序。
data.sort((a,b)=>a['name'].localeCompare(b['name']));
localeCompare表示本地默认排序方式。a['name'].localeCompare(b['name'])
表示按照本地排序的方式,以a.name与b.name的排序方式来排序data;
如果想反过来排序的话怎么办的话:
上面说过,sortby的排序只根据正数/0/负数,那么字母之间肯定也是有这样的大小规律,倒序排序的话,只要把返回值变成其相反数即可。b['name'].localeCompare(a['name'])
;
或者-(a['name'].localeCompare(b['name']))
;
通过age排序
age排序和上面的数字排序是一样的使用方法,从a-b
变成了a[age]-b[age]
;
再复杂点的中文排序:
其实中文排序简单粗暴地转出拼音排序就可以了...
为什么说复杂呢,是因为要导入一个巨大的js,而且还需要转行成拼音。
比如说:
let pinyin = {a:"\u554a\u963f\u9515",
ai:"\u57c3\u6328\u54ce\u5509\u54c0\u7691\u764c\u853c\u77ee\u827e\u788d\u7231\u9698\u8bf6\u6371\u55f3\u55cc\u5ad2\u7477\u66a7\u7839\u953f\u972d",
...}
获取拼音的方法:
function(word){
for(let key in pinyin){
if(pinyin[key].includes(word)){
return key;
}
}}
然后就可以按照字母的排序方式来进行排序了。