js 模拟windows文件夹名称排序

2019-07-24  本文已影响0人  疯子y

今天在做一个对文件夹名称排序的需求,百度找了几圈没找到有js关于文件名排序的。 加上本人是个新手,所以折腾大半天终于搞定了、分享一下给有需要的小伙伴。

windows文件名排序的风格是: 特殊字符>数字>字母>中文 ,所以按照这个思路对文件名的每个字符进行对比即可。

/**
 * 
 * @param {对数组文件名进行 模仿windows的命名来排序} arr 
 */
function mb_PaiXu(a, b) {

  //获取2个字符串最短的
  //设置如果相比前面字符都一样,那么则最短的调换位置  
  var len = a.length, re = -1; 
  if (a.length > b.length) { //获取最短的那个字符串长度
    len = b.length;
    re = 1;
  }
  
  //循环对每个字符串遍历对比
  for (var i = 0; i < len; i++) {
    var n1 = f_HuoQuZiFuLeiXing(a[i]); //获取当前字符的类型, 4特殊符号  3数字 2字母 1中文
    var n2 = f_HuoQuZiFuLeiXing(b[i]);

    if (a[i] == b[i] && n1 != 3)//如果2个字符相等,并且不是数字则不对比
      continue;
    
    if (n1 > n2) //不同类型的, 特殊字符>数字>字母>中文 可以直接换位置
      return -1;
    else if (n1 < n2)//不同类型的,换相反位置
      return 1;
    else { //2个是同类型的,那需要进行同类的的对比
      //相同类型的对比
      if (n1 == 4) //特殊字符,直接返回不对比
        return -1;
      if (n1 == 3)//数字的时候的比较方式,是获取后面的全部数字对比
      {
        //  alert(a.substring(i)+"  "+b.substring(i));
        var num1 = parseInt(a.substring(i));
        var num2 = parseInt(b.substring(i));
        if (num1 == num2) //如果数字相等,那么也跳过不对比
          continue;
        return num1 - num2; //
      }
      else if (n1 == 2)//字母的比较方式, 转成小写字母后对比
      {
        return a[i].toLowerCase() > b[i].toLowerCase();
      }
      else if (n1 == 1)//中文字符
      {
        return a[i].localeCompare(b[i]);
      }
    }
  }
  // alert("结束:" + a + " " + b);
  return re;
}

/**
 * 
 * @param {获取字符属于哪种类型} str 
 */
function f_HuoQuZiFuLeiXing(str) {
  var a;
  if (/[@\/'\\"#$%&()\^*]/.test(str)) { //特殊字符
    a = 4;
  }
  else if (/^\+?[1-9][0-9]*$/.test(str)) { //数字
    a = 3;
  }
  else if (/[a-z]/i.test(str)) { //字母
    a = 2;
  }
  else { //剩下的就是中文了
    a = 1;
  }
  return a;
}

使用方法

var arr=["哈哈1","11测试","哈哈11","哈哈3"];
arr.sort(mb_PaiXu);

经过测试没问题,至于性能方面,就不知道啦。 本人菜鸡一个

上一篇下一篇

猜你喜欢

热点阅读