Javascript Array 重排序方法
數(shù)組中已經(jīng)存在兩個(gè)可以直接用來(lái)重排序的方法:reverse()和sort()。有讀者可能猜到了,reverse()方法會(huì)對(duì)反轉(zhuǎn)數(shù)組項(xiàng)的順序。請(qǐng)看下面這個(gè)例子:
var values= [1, 2, 3, 4, 5];
values.reverse();
alert (values); //5,4,3,2,1
這里數(shù)組的初始值及順序是1、2、3、4、5。而調(diào)用數(shù)組的reverse()方法后,其值的順序變成了5、4、3、2、1。這個(gè)方法的作用相當(dāng)直觀明了,但不夠靈活,因此才有了sort()方法。
在默認(rèn)情況下,sort()方法按升序排列數(shù)組項(xiàng)——即最小的值位于最前面,最大的值排在最后面。為了實(shí)現(xiàn)排序,sort()方法會(huì)調(diào)用每個(gè)數(shù)組項(xiàng)的toString()轉(zhuǎn)型方法,然后比較得到的字符串,以確定如何排序。即使數(shù)組中的每一項(xiàng)都是數(shù)值,sort()方法比較的也是字符串,如下所示:
var values= [0, 1, 5, 10, 15];
values.sort();
alert (values); //0,1,10.15,5
可見,即使例子中值的順序沒有問題,但sort()方法也會(huì)根據(jù)測(cè)試字符串的結(jié)果改變?cè)瓉?lái)的順序。因?yàn)閿?shù)值5雖然小于10,但在進(jìn)行字符串比較時(shí),"10"則位于"5"的前面,于是數(shù)組的順序就被修改了。不用說(shuō),這種排序方式在很多情況下都不是最佳方案。因此sort()方法可以接收一個(gè)比較函數(shù)作為參數(shù),以便我們指定哪個(gè)值位于哪個(gè)值的前面。
比較函數(shù)接收兩個(gè)參數(shù),南昌網(wǎng)站制作工程師提示,如果第一個(gè)參數(shù)應(yīng)該位于第二個(gè)之前則返回一個(gè)負(fù)數(shù),如果兩個(gè)參數(shù)相等則返回0,如果第一個(gè)參數(shù)應(yīng)該位于第二個(gè)之后則返回一個(gè)正數(shù)。以下就是一個(gè)簡(jiǎn)單的比較函數(shù):
function compare (valuel, value2) {
if (valuel return -1:
} else if (valuel>value2) {
return 1:
} else {
return 0:
}
}
這個(gè)比較函數(shù)可以適用于大多數(shù)數(shù)據(jù)類型,只要將其作為參數(shù)傳遞給sort()方法即可,如下面這個(gè)例子所示:
var values=[O, 1, 5, 10, 15];
alert (values); //0,1, 5,10,15
在將比較函數(shù)傳遞到sort()方法之后,數(shù)值仍然保持了正確的升序。當(dāng)然,也可以通過比較函數(shù)產(chǎn)生降序排序的結(jié)果,只要交換比較函數(shù)返回的值即可:
function compare (valuel, value2) {
if(valuel < value2) {
}else if(valuel>value2) {
}else {
return O:
}
}
var values= [0, 1, 5, 10, 15];
values.sort (compare);
alert (values); // 15 ,10,5,1,0
在這個(gè)修改后的例子中,比較函數(shù)在第一個(gè)值應(yīng)該位于第二個(gè)之后的情況下返回l,而在第一個(gè)值應(yīng)該在第二個(gè)之前的情況下返回一1。.交換返回值的意思是讓更大的值排位更靠前,也就是對(duì)數(shù)組按 照降序排序。當(dāng)然,如果只想反轉(zhuǎn)數(shù)組原來(lái)的順序,使用reverse()方法要更快一些。
南昌網(wǎng)頁(yè)設(shè)計(jì)公司工程師提醒,reverse()和sort()方法的返回值是經(jīng)過排序之后的數(shù)組.
對(duì)于數(shù)值類型或者其valueOf()方法會(huì)返回?cái)?shù)值類型的對(duì)象類型.可以使用一個(gè)更簡(jiǎn)單的比較函數(shù):這個(gè)函數(shù)只要用第二個(gè)值減第一個(gè)值即可①:
function compare (valuel, value2){
return value2 - valuel;
}
由于比較函數(shù)通過返回一個(gè)小于零、等于零或大于零的值來(lái)影響排序結(jié)果,因此減法操作就可以適當(dāng)?shù)靥幚硭羞@些情況。
①南昌建網(wǎng)站公司百恒網(wǎng)絡(luò)前端開發(fā)工程師,如果想要按照升序排序,則compare()函數(shù)中的return語(yǔ)句應(yīng)該返回value2-value1.
希望本文對(duì)廣大站長(zhǎng)或從事企業(yè)網(wǎng)站建設(shè)公司的團(tuán)隊(duì)有所幫助,如對(duì)此不太理解的,可以與南昌做網(wǎng)站公司百恒網(wǎng)絡(luò)技術(shù)部聯(lián)系。我們很高興與廣大站長(zhǎng)和從事企業(yè)網(wǎng)站建設(shè)公司技術(shù)人員分享我們的技術(shù)和經(jīng)驗(yàn)。