模仿windows文件夹排序

export function sortLikeWin (v1, v2) {
  function commonCompare (v1, v2) {
    if (v1 === v2) {
      return 0
    } else {
      return v1 < v2 ? -1 : 1
    }
  }
  var a = v1.name
  var b = v2.name
  var reg = /[0-9]+/g
  var lista = a.match(reg)
  var listb = b.match(reg)
  if (!lista || !listb) {
    return commonCompare(a, b)
  }
  for (var i = 0, minLen = Math.min(lista.length, listb.length); i < minLen; i++) {
          // 数字所在位置序号
    var indexa = a.indexOf(lista[i])
    var indexb = b.indexOf(listb[i])
          // 数字前面的前缀
    var prefixa = a.substring(0, indexa)
    var prefixb = b.substring(0, indexb)
          // 数字的string
    var stra = lista[i]
    var strb = listb[i]
          // 数字的值
    var numa = parseInt(stra)
    var numb = parseInt(strb)
          // 如果数字的序号不等或前缀不等,属于前缀不同的情况,直接比较
    if (indexa != indexb || prefixa != prefixb) {
      return commonCompare(a, b)
    } else {
              // 数字的string全等
      if (stra === strb) {
                  // 如果是最后一个数字,比较数字的后缀
        if (i == minLen - 1) {
          return a.substring(indexa).localeCompare(b.substring(indexb))
        }
                  // 如果不是最后一个数字,则循环跳转到下一个数字,并去掉前面相同的部分
        else {
          a = a.substring(indexa + stra.length)
          b = b.substring(indexa + stra.length)
        }
      }
                  // 如果数字的string不全等,但值相等
      else if (numa == numb) {
                  // 直接比较数字前缀0的个数,多的更小
        return strb.lastIndexOf(numb + '') - stra.lastIndexOf(numa + '')
      } else {
                  // 如果数字不等,直接比较数字大小
        return numa - numb
      }
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值