zoukankan      html  css  js  c++  java
  • js实现仿windows文件按名称排序

    作个记录,主要是对数字的处理,如果数字的前面字符是相同的,则数字以值比较,而不是单个字符之间的比较。

     1         function SortLikeWin(v1, v2) {
     2             var a = v1.name;
     3             var b = v2.name;
     4             var reg = /[0-9]+/g;
     5             var lista = a.match(reg);
     6             var listb = b.match(reg);
     7             if (!lista || !listb) {
     8                 return a.localeCompare(b);
     9             }
    10             for (var i = 0, minLen = Math.min(lista.length, listb.length) ; i < minLen; i++) {
    11                 //数字所在位置序号
    12                 var indexa = a.indexOf(lista[i]);
    13                 var indexb = b.indexOf(listb[i]);
    14                 //数字前面的前缀
    15                 var prefixa = a.substring(0, indexa);
    16                 var prefixb = b.substring(0, indexb);
    17                 //数字的string
    18                 var stra = lista[i];
    19                 var strb = listb[i];
    20                 //数字的值
    21                 var numa = parseInt(stra);
    22                 var numb = parseInt(strb);
    23                 //如果数字的序号不等或前缀不等,属于前缀不同的情况,直接比较
    24                 if (indexa != indexb || prefixa != prefixb) {
    25                     return a.localeCompare(b);
    26                 }
    27                 else {
    28                     //数字的string全等
    29                     if (stra === strb) {
    30                         //如果是最后一个数字,比较数字的后缀
    31                         if (i == minLen - 1) {
    32                             return a.substring(indexa).localeCompare(b.substring(indexb));
    33                         }
    34                         //如果不是最后一个数字,则循环跳转到下一个数字,并去掉前面相同的部分
    35                         else {
    36                             a = a.substring(indexa + stra.length);
    37                             b = b.substring(indexa + stra.length);
    38                         }
    39                     }
    40                         //如果数字的string不全等,但值相等
    41                     else if (numa == numb) {
    42                         //直接比较数字前缀0的个数,多的更小
    43                         return strb.lastIndexOf(numb + '') - stra.lastIndexOf(numa + '');
    44                     }
    45                     else {
    46                         //如果数字不等,直接比较数字大小
    47                         return numa - numb;
    48                     }
    49                 }
    50             }
    51         }

    使用方法,Array.sort(SortLikeWin);

     注:localecompare 比较中文的时候有问题,替换为

    function commonCompare(v1, v2){
      if(v1 === v2){
         return 0;
        }      
      else{
        return v1<v2?-1:1;
      }
    }    
  • 相关阅读:
    使用 PHPMailer 发邮件
    安装phpssdb扩展:
    CI安全
    CI调试应用程序
    Sphinx的GEO距离搜索 [转载]
    Lua开发环境搭建(Mac OS X)
    MySQL 的索引和最左前缀原则
    PHP解码Json(json_decode)字符串返回NULL的原因及解决方法(转载)
    PHP连接MySQL报错"No such file or directory"的解决办法
    web 性能优化指南阅读笔记
  • 原文地址:https://www.cnblogs.com/xlzhang/p/5625834.html
Copyright © 2011-2022 走看看