sort排序问题

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;
        }
    }}

然后就可以按照字母的排序方式来进行排序了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值