關(guān)于數(shù)組排序馬上會想到sort方法,或者reverse方法 但是后者只是簡單的逆序而已不能滿足大部分需求。
前者功能強(qiáng)大便于擴(kuò)展,該方法有一個自定義排序函數(shù),一般而言針對數(shù)字或者同類型不復(fù)雜元素很容易進(jìn)行自定義排序函數(shù),該函數(shù)有兩個參數(shù):
比如數(shù)組var arr=[2,3,5,1,4] ; 需要升序排列,我們可以這樣:
function Compare(va1,va2){ return va2-va1;}
arr.sort(Compare); alert(arr);最后輸出1,2,3,4,5
但是如果遇到復(fù)雜的數(shù)組元素,比如:
var data = [{ name: "jiang", age: 23 }, { name: "zheng", age: 18 }, { name: "baidu", age: 8 }, { name: "javascript", age: 19}];
數(shù)組中含有對象對象中有許多屬性,如何根據(jù)屬性排序呢?
這時候就要重寫排序規(guī)則函數(shù)了,可是該函數(shù)只接受兩個參數(shù),如何才能根據(jù)特定屬性排序呢,比如這里的age,name
熟悉函數(shù)特性的都知道,函數(shù)在javascript中不同于其他語言,函數(shù)是對象,函數(shù)中可以返回函數(shù),因此可以在外函數(shù)中傳入屬性,內(nèi)函數(shù)接收兩個參數(shù),比如這里的數(shù)組中對象元素。
實現(xiàn)如下:
//自定義排序函數(shù),傳入屬性,返回接收兩個參數(shù)的排序函數(shù)
function createComparsionFunction(propertyName)
{
return function(object1, object2)
{
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if (value1 < value2)
{
return -1;
} else if (value1 > value2)
{
return 1;
} else
{
return 0;
}
}
}
var data = [{ name: "zheng", age: 5 }, { name: "jiang", age: 18 }, { name: "google", age: 11 }, { name: "javascript", age: 19}];
document.write("----------------------原始序列-------------------------", "</br>");
for (var i = 0, ilen = data.length; i < ilen; i++)
{
document.write(data[i].name + ":" + data[i].age, "</br>");
}
document.write("----------------------age升序-------------------------", "</br>");
data.sort(createComparsionFunction("age")); //根據(jù)age排序
for (var i = 0, ilen = data.length; i < ilen; i++)
{
document.write(data[i].name + ":" + data[i].age, "</br>");
}
document.write("----------------------name升序-------------------------", "</br>");
data.sort(createComparsionFunction("name")); //根據(jù)age排序
for (var i = 0, ilen = data.length; i < ilen; i++)
{
document.write(data[i].name + ":" + data[i].age, "</br>");
}
效果如下:
