1. 程式人生 > 其它 >js 陣列萬能sort排序方法

js 陣列萬能sort排序方法

 排序順序規則:數字0=》數字非0開頭=》字母開頭=》漢字開頭=》其他開頭  排序邏輯:先按以上排序順序將陣列分為多個數組,再使用陣列的concat方法將拆分的陣列按順序拼成一個新的陣列。  詳細:   (1).將0開頭和非0開頭分開是因為,0開頭的必須在非0開頭的前面,但使用parseInt轉換後013就變成了13。   (2).只有數字做了進一步判斷,如果使用parseInt轉換後的數字相等,則按照系統預設的localeCompare方法進行排序,此時數字相等,localeCompare方法會根據系統排序方法對後續字元進行排序。   (3).簡單分析下sort的比較函式:返回值為負數則將位置前移一項,為正數和0則保持不變。

程式碼:

 1   // 陣列排序
 2         arraySort(list, filedname) {
 3             var rankArr = []
 4             // 篩選出數字0開頭的集合
 5             var zeroArr = list.filter((ele, index) => {
 6               if (Number(ele[filedname].substr(0, 1)) === 0) {
 7                     return !isNaN(Number(ele[filedname].substr(0, 1)))
8 } 9 }) 10 // 數字0開頭排序 11 zeroArr = zeroArr.sort((a, b) => { 12 // return parseInt(a[filedname]) - parseInt(b[filedname]) 13 return a[filedname].replace(/[^0-9]/ig, '') - b[filedname].replace(/[^0-9]/ig, '') 14 })
15 rankArr = zeroArr 16 // 篩選出數字非0開頭的集合 17 var numArr = list.filter((ele, index) => { 18 if (Number(ele[filedname].substr(0, 1)) !== 0) { 19 return !isNaN(Number.parseInt(ele[filedname].substr(0, 1))) 20 } 21 }) 22 // 數字非0開頭排序 23 numArr = numArr.sort((a, b) => { 24 if (Number.parseInt(a[filedname]) - Number.parseInt(b[filedname]) == 0) { // 如果數字相等 再按系統預設順序排序 25 return a[filedname].localeCompare(b[filedname]) 26 } 27 else { 28 return Number.parseInt(a[filedname]) - Number.parseInt(b[filedname]) 29 } 30 }) 31 // 篩選出大寫字母開頭的 32 var regUpper = /^[A-Za-z]+$/ 33 var upperArr = list.filter((ele, index) => { 34 return regUpper.test(ele[filedname].substr(0, 1)) 35 }) 36 // 大寫字母開頭排序 37 upperArr = upperArr.sort((a, b) => { 38 return a[filedname].localeCompare(b[filedname]) 39 }) 40 // 篩選出漢字開頭開頭的 41 var reg = new RegExp('^[\u4e00-\u9fa5]') 42 var wordArr = list.filter((ele, index) => { 43 return reg.test(ele[filedname].substr(0, 1)) 44 }) 45 // 漢字開頭排序 46 wordArr = wordArr.sort((a, b) => { 47 return a[filedname].localeCompare(b[filedname]) 48 }) 49 // 剩餘其他的開頭 50 var otherArr = list.filter((ele, index) => { 51 return isNaN(Number(ele[filedname].substr(0, 1))) && !reg.test(ele[filedname].substr(0, 1)) && !regUpper.test(ele[filedname].substr(0, 1)) 52 }) 53 // 剩餘其他的開頭排序 54 otherArr = otherArr.sort((a, b) => { 55 return a[filedname].localeCompare(b[filedname]) 56 }) 57 list = rankArr 58 list = list.concat(numArr, upperArr, wordArr, otherArr) 59 return list; 60 },