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