美文网首页
js 模拟windows文件夹名称排序

js 模拟windows文件夹名称排序

作者: 疯子y | 来源:发表于2019-07-24 00:11 被阅读0次

    今天在做一个对文件夹名称排序的需求,百度找了几圈没找到有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);
    

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

    相关文章

      网友评论

          本文标题:js 模拟windows文件夹名称排序

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