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 },
分类:
前端
, JavaScript
标签:
前端
, javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构