作个记录,主要是对数字的处理,如果数字的前面字符是相同的,则数字以值比较,而不是单个字符之间的比较。
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; } }