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 },
标签:sort,return,list,filedname,ele,开头,js,排序 来源: https://www.cnblogs.com/Hush-/p/16088009.html