**的要求是我不得不上的动力啊~~~
具体需求描述:
1. 中文,按拼音排序,
2. 如有数字,要解析出来,不能当做字符串
2. 如有数字,要解析出来,不能当做字符串
按照从左往右的对比。例如
原素组 :["华星街3号集控器","华星路100号0#箱变","安河路200号","张和顺1号","华星路99号10#箱变","华星路99号2#箱变","1#箱","2#","2#箱变","1#箱变"];
排序后 :["1#箱", "1#箱变", "2#", "2#箱变", "安河路200号", "华星街3号集控器", "华星路99号2#箱变", "华星路99号10#箱变", "华星路100号0#箱变", "张和顺1号"];
思路:
想的就是把字符串分解成数组,然后这个数组有点特殊,数字的话就存成 number 类型的一个元素;例如:"华星路99号2#箱变" 会解析成数组 : ["华", "星", "路", 99, "号", 2, "#", "箱", "变"] 。搞成这样就思路更清晰了,都是数字按照数学的大小排序,若不是数组,我使用的是 a.localeCompare(b,'zh-CN') . 这样是汉字按照拼音排序(没有使用大量数据测试,可能出现排序异常哈)
结果:
基本满足需求,后续如果有特殊情况再来修改!时间,执行完花了 5ms。(虽然我知道一堆for循环很low,可以给我优化建议的~)
以下就上代码:
function sortarr(){ var arr = ["华星街3号集控器","华星路100号0#箱变","安河路200号","张和顺1号","华星路99号10#箱变","华星路99号2#箱变","1#箱","2#","2#箱变","1#箱变"]; var temp =''; console.log('starttime : ' + (new Date()).getTime()) //冒泡排序 for(var i=0;i<arr.length-1;i++){ for(var j=arr.length-1;j>i;j--){ if(sortstr(arr[j-1],arr[j]) > 0){ //返回true;需要交换顺序 var temp = arr[j-1]; arr[j-1] =arr[j]; arr[j] = temp; } } } console.log('endtime : ' +(new Date()).getTime()) return arr; } //将字符串解析成数组 function dealstrToArr(s){ var st1 = s.split(''); var nst1=[]; var t=""; for(var i=0;i<st1.length;i++){ if(isNaN(parseInt(st1[i]))){ nst1.push(st1[i]); }else{ t+=st1[i]; if(isNaN(parseInt(st1[i+1]))){ nst1.push(parseInt(t)); t=""; } } } return nst1; } //s1 < s2 -1; s1>s2 1; function sortstr(s1,s2){ /* 1. 中文,按拼音排序, 2. 如有数字,要解析出来,不能当做字符串 # */ var as1 = dealstrToArr(s1); var as2 = dealstrToArr(s2); var minlength = as1.length>as2.length ? as2.length : as1.length; for(var i=0;i<minlength;i++){ if(as1[i] !== as2[i]){ if(typeof(as1[i]) == 'number' && typeof(as2[i]) == 'number'){ return (as1[i] - as2[i]); }else if(typeof(as1[i]) == 'number' && typeof(as2[i]) != 'number'){ return -1; }else if(typeof(as1[i]) != 'number' && typeof(as2[i]) == 'number'){ return 1; }else{ return as1[i].localeCompare(as2[i],'zh-CN'); } } } if(i == (minlength-1)){ return minlength == as1.length ? -1 : 1 ; } }