为字符串数组排序。每个字符串可能包含数字,字母,汉字

**的要求是我不得不上的动力啊~~~

具体需求描述:

 1. 中文,按拼音排序,
 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 ;
    }
}

 

posted @ 2019-07-18 16:59  Toyocc  Views(718)  Comments(0Edit  收藏  举报