js混合排序(数字+字母+中文)

项目中有时需要对数组对象中的某个属性进行排序,属性值按照一定的规则进行排序,下面以数字-中文首字母-英文大写-英文小写的顺序进行排序进行举例。

数据:

var info = [
{id:1,name:'101路',price:'2'},
{id:2,name:'02路',price:'2'},
{id:3,name:'r11',price:'2'},
{id:4,name:'6路',price:'2'},
{id:5,name:'23路',price:'2'},
{id:6,name:'01路',price:'2'},
{id:7,name:'g2020',price:'2'},
{id:8,name:'R2018',price:'2'},
{id:9,name:'G101',price:'2'},
{id:10,name:'线路',price:'2'},
{id:11,name:'路线',price:'2'}
]

排序:

var rankArr = []
 // 数字0开头
  var zeroArr = info .filter((ele, index) => {
      if (Number(ele.name.substr(0, 1)) === 0) {
          return !isNaN(Number(ele.name.substr(0, 1)))
       }
   })
 // 数字0开头排序
 zeroArr = zeroArr.sort((a, b) => {
 // return parseInt(a.name) - parseInt(b.name)
     return a.name.replace(/[^0-9]/ig, '') - b.name.replace(/[^0-9]/ig, '')
  })
 rankArr = zeroArr
 // 数字非0开头
var numArr = info .filter((ele, index) => {
   if (Number(ele.name.substr(0, 1)) !== 0) {
      return !isNaN(Number(ele.name.substr(0, 1)))
   }
 })
// 数字非0开头排序
numArr = numArr.sort((a, b) => {
     return a.name.replace(/[^0-9]/ig, '') - b.name.replace(/[^0-9]/ig, '')
 })
 // 汉字开头
 var reg = new RegExp('^[\u4e00-\u9fa5]')
    var wordArr = info .filter((ele, index) => {
        return reg.test(ele.name.substr(0, 1))
    })
// 汉字开头排序
wordArr = wordArr.sort((a, b) => {
     return a.name.localeCompare(b.name)
})
// 大写字母开头
var regUpper = /^[A-Z]+$/
var upperArr = info .filter((ele, index) => {
     return regUpper.test(ele.name.substr(0, 1))
})
// 大写字母开头排序
upperArr = upperArr.sort((a, b) => {
    return a.name.localeCompare(b.name)
})
// 剩余其他的开头
var otherArr = info .filter((ele, index) => {
    return isNaN(Number(ele.name.substr(0, 1))) && !reg.test(ele.name.substr(0, 1)) && !regUpper.test(ele.name.substr(0, 1))
})
// 剩余其他的开头排序
 otherArr = otherArr.sort((a, b) => {
 return a.name.localeCompare(b.name)
})
info  = rankArr
info  = this.info.concat(numArr, wordArr, upperArr, otherArr)

排序结果:

image.png

可以将该排序规则封装,形参为数组和数组对象中的某个属性,使用时只要把这两个参数传进方法,然后return出排序结果。

另外,如果需要对字符串中的数字字母或汉字进行更细致的排序,那么可以在排序之后进行多次再排序得到想要的排序效果,方法还是前面那些基础的方法,根据需求进行自由组合得出一套排序规则。

你可能感兴趣的:(js混合排序(数字+字母+中文))