javascript深度理解數組排序

今天查到數組的sort函數可以接受自定義比較函數,這真是一件妙事兒。

這樣對(數字類型表示范圍以內的)數字進行排序就變得極為簡單瞭。

var myArray = [-80,-13.888,-10,-9.6,-9.4,-1,2,2,3,5.823,7.999,20,0,22,55,312];  

iJs.put(myArray.sort(function(a,b){return a-b})); 

 調試信息: 

    -80,-13.888,-10,-9.6,-9.4,-1,0,2,2,3,5.823,7.999,20,22,55,312

如果想降序,a-b改為b-a即可:

var myArray = [-80,-13.888,-10,-9.6,-9.4,-1,2,2,3,5.823,0,7.999,20,22,55,312];  

iJs.put(myArray.sort(function(a,b){return b-a}));//此處為b-a 

調試信息: 

    312,55,22,20,7.999,5.823,3,2,2,0,-1,-9.4,-9.6,-10,-13.888,-80

構造返回比較函數的函數,可以達到更為靈活的目的。為此我寫瞭一個一維二維數組通用的排序函數如下(未經充分測試,如用於生產,最好再測一下啊):

//類型相同則比大小,升降由option的第一個參數指定  

//類型不同則比類型,升降由option的第二個參數指定  

//如果是對象或數組,則按name指定屬性或元素參與排序  

//比大小結果相同則按照secondby指定的規則排序  

var by = function(name,option,secondby){  

    return function(o,p){  

        var a,b;  

        var sign=1;//調節順序  

        var r;//保存返回值  

 

        //如果是對象或數組,則按name指定屬性或元素參與排序  

        if(o && typeof o === 'object'){  

            a = o[name];  

        }else{  

            a = o;  

        }  

        if(p && typeof p === 'object'){  

            b = p[name];  

        }else{  

            b = p;  

        }  

 

        if(typeof a === typeof b){  

            //升降由option的第一個參數指定  

            switch(option[0]){  

                case "desc" :   

                    sign = 1;  

                    break;  

                case "asc" :  

                    sign = -1;  

                    break;  

                default:  

                    sign = 1;//默認  

            }             

        }else{  

            //類型不同則比類型  

            a = typeof a;  

            b = typeof b;  

            //升降由option的第二個參數指定  

            switch(option[1]){  

                case "desc" :   

                    sign = 1;  

                    break;  

                case "asc" :  

                    sign = -1;  

                    break;  

                default:  

                    sign = 1;//默認  

            }  

        }  

 

        if(a === b){  

            r = typeof secondby === "function" ? secondby(o,p):0;//遞歸支持多個參數排序  

        }else if(a<b){  

            r = 1*sign;  

        }else{  

            r = -1*sign;  

        }  

 

        return r;  

    }  

}  

 

//判斷是否數組  

var is_array = function(value){  

    return value && //有值  

        typeof value === "object" && //typeof查出類型為object  

        typeof value.length === "number" && //length屬性是number類型  

        typeof value.splice === "function" && //有splice方法  

        !(value.propertyIsEnumerable("length"))//length是一個不可枚舉的屬性  

}  

 

//輸出二維數組  

var puts = function(myObj){  

    for(var i=0;i<myObj.length;i+=1){  

        var tmp = "";  

        if(is_array(myObj[i])){  

            for(var j=0;j<myObj[i].length;j+=1){  

                tmp = tmp + myObj[i][j] + ",";  

            }  

        }else{  

            for(name in myObj[i]){  

                tmp = tmp + name + ":" + myObj[i][name] + ",";  

            }             

        }  

        iJs.put(tmp);  

    }  

}  

 

 

var myArray=new Array();  

 

//例1  

myArray = [  

    {"a":1,"b":1,"c":1},  

    {"a":3,"b":3,"c":1},  

    {"a":3,"b":4,"c":1},  

    {"a":3,"b":1,"c":1},  

    {"a":2,"b":1,"c":2},  

    {"a":2,"b":1,"c":1},  

];  

myArray = myArray.sort(  

    by("a",["asc"],  

    by("b",[],  

    by("c",["asc"])))  

);  

puts(myArray);  

 

 

//例2  

myArray = [  

    [1,1,1],  

    [3,3,1],  

    [3,4,1],  

    [3,1,1],  

    [2,1,2],  

    [2,1,1]  

];  

myArray = myArray.sort(  

    by(0,["asc"],  

    by(1,[],  

    by(2,["asc"])))  

);  

puts(myArray);  

 

 

//例3  

myArray = [-80,-13.888,-10,-9.6,-9.4,-1,2,2,3,5.823,0,7.999,20,22,55,312];  

myArray = myArray.sort(  

    by(null,["asc"])  

);  

iJs.put("");  

iJs.put(myArray); 

調試信息: 

    a:1,b:1,c:1,

    a:2,b:1,c:1,

    a:2,b:1,c:2,

    a:3,b:4,c:1,

    a:3,b:3,c:1,

    a:3,b:1,c:1,

    

    1,1,1,

    2,1,1,

    2,1,2,

    3,4,1,

    3,3,1,

    3,1,1,

    

    -80,-13.888,-10,-9.6,-9.4,-1,0,2,2,3,5.823,7.999,20,22,55,312

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *