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;
      }
    }    
  • 相关阅读:
    ES6 一些新特性的总结
    前端模块化开发的规范:AMD与CDM
    webpack与grunt/glub 的比较
    前端总结(一)
    前端性能的优化
    Typescript 常见写法
    显示模式------行内元素、块元素,行内块元素
    浏览器前缀及内核
    BFC规范
    数据库习题练习
  • 原文地址:https://www.cnblogs.com/xlzhang/p/5625834.html
Copyright © 2011-2022 走看看