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

而後就能夠按照字母的排序方式來進行排序了。

相關文章
相關標籤/搜索