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         },
复制代码

 

 

posted @   KleinBlue_克莱因蓝  阅读(362)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示