美文网首页
js混合排序(数字+字母+中文)

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

作者: zkyellow | 来源:发表于2020-06-22 20:31 被阅读0次

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

    数据:

    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混合排序(数字+字母+中文)

          本文链接:https://www.haomeiwen.com/subject/mxyffktx.html