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;
  }
}    
原文地址:https://www.cnblogs.com/xlzhang/p/5625834.html