sort排序问题

w3school上对sort()用法的定义为:arrayObject.sort(sortby)
顾名思义 :排序对象.排序(排序方法)
arrayObject直接 跳过了。
sort详解也暂时先跳过,我略看了下源码,对于arrayObject的排序并非单独使用的一种,个数少的时候用的插入排序,个数多的时候用的快速排序。
直接说 sortby的用法。json

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);code


复杂点的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']));io

经过age排序
age排序和上面的数字排序是同样的使用方法,从a-b变成了a[age]-b[age];function


再复杂点的中文排序:原理

其实中文排序简单粗暴地转出拼音排序就能够了...
为何说复杂呢,是由于要导入一个巨大的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;
        }
    }}

而后就能够按照字母的排序方式来进行排序了。

相关文章
相关标签/搜索