客户有个需要是须要在表格中依照windows的命名排序规定进行排序,例如文件名如下:3.1、3.2、3.10、3.11应该依照这个程序排,数据库中貌似没法排,当初前端实现:
sortLikeWin(fieldName = 'resName', v1, v2) { let a = v1[fieldName]; let b = v2[fieldName]; let reg = /[0-9]+/g; let lista = a.match(reg); let listb = b.match(reg); if (!lista || !listb) { return a.localeCompare(b); } for (let i = 0, minLen = Math.min(lista.length, listb.length); i < minLen; i++) { //数字所在位置序号 let indexa = a.indexOf(lista[i]); let indexb = b.indexOf(listb[i]); //数字后面的前缀 let prefixa = a.substring(0, indexa); let prefixb = b.substring(0, indexb); //数字的string let stra = lista[i]; let strb = listb[i]; //数字的值 let numa = parseInt(stra); let numb = parseInt(strb); //如果数字的序号不等或前缀不等,属于前缀不同的状况,间接比拟 if (indexa != indexb || prefixa != prefixb) { return a.localeCompare(b); } else { //数字的string全等 if (stra === strb) { //如果是最初一个数字,比拟数字的后缀 if (i == minLen - 1) { return a.substring(indexa).localeCompare(b.substring(indexb)); } //如果不是最初一个数字,则循环跳转到下一个数字,并去掉后面雷同的局部 else { a = a.substring(indexa + stra.length); b = b.substring(indexa + stra.length); } } //如果数字的string不全等,但值相等 else if (numa == numb) { //间接比拟数字前缀0的个数,多的更小 return strb.lastIndexOf(numb + '') - stra.lastIndexOf(numa + ''); } else { //如果数字不等,间接比拟数字大小 return numa - numb; } } } },
调用办法
this.sortLikeWin.bind(null, 'resName')
排序前:
排序后: