js 写一个万能排序。

javascript 的数组有一个排序的功能 sort,但是在很多时候靠比大小并不能满足我们的需求。

比如: 字符串的排序, 我们以为:a10 > a9, 但是js 判断出来确是a9 > a10

万能排序的思想是,把字符串和数字分离开来。

     比如 a9,  a10, b8 进行排序。

     我们把他们拆分成   [a, 9]  [a, 10]  [b, 8] 再通过相同的下标位来比大小,如果相等再比下一个。

     自然排序之后就会变成我们想要的样子  a9,  a10,  b8

Arr.sort((lhs, rhs) => {

  var intOrString = (s) => {
    var n = parseInt(s)
    return isNaN(n) ? s : n
  }
  let lhsArr = lhs.toString().split(/(\d+)/).map(intOrString)
  let rhsArr = rhs.toString().split(/(\d+)/).map(intOrString)
  var isLower = true

  for (var i = 0; i < lhsArr.length; i++) {
    if (i >= rhsArr.length) {
      break
    } else if (lhsArr[i] !== rhsArr[i]) {
      isLower = lhsArr[i] < rhsArr[i]
      break
    }
  }

  return isLower ? -1 : 1
})

当然了,这个函数貌似过于简单, 实际上我们遇到的情景一般是这样的:

      一个表格数据, 然后排序自然是根据 name, age, sex, buy的某一个进行排序。
 

[
    {name: '1-1', age: 25, sex: 'gril', buy: 'a1-9'},
    {name: '1-10', age: 24, sex: 'man', buy: 'b1-9'},
    {name: '3-10', age: 22, sex: 'gril', buy: 'a1-11'},
    {name: '3-8', age: 21, sex: 'man', buy: 'c1-3'}
]

OK, 我们接下来对我们的排序进行一个封装.

function sort_ (list, {sortBy, sortOrder}) {
  list.sort((lhs, rhs) => {
    let optionNow = lhs[sortBy] || ''
    let optionNext = rhs[sortBy] || ''
  
    var intOrString = (s) => {
      var n = parseInt(s)
      return isNaN(n) ? s : n
    }
    let lhsArr = optionNow.toString().split(/(\d+)/).map(intOrString)
    let rhsArr = optionNext.toString().split(/(\d+)/).map(intOrString)
    var isLower = true
    for (var i = 0; i < lhsArr.length; i++) {
      if (i >= rhsArr.length) {
        break
      } else if (lhsArr[i] !== rhsArr[i]) {
        isLower = lhsArr[i] < rhsArr[i]
        break
      }
    }
    if (optionNow !== optionNext) {
      if (sortOrder) isLower = !isLower
    }
    return isLower ? -1 : 1
  })
}

其中,list就是你要排序的对象,sortBy表示根据哪个key排序,sortOrder表示正序或者倒序。

你可能感兴趣的:(javascript,sort,排序,对象排序)