JavaScript中sort方法的使用及原理詳解

2021-08-17 06:23:26 字數 1910 閱讀 8203

原生js中提供了兩個用來重排序的方法:reverse()和sort(),reverse()沒什麼好說的,就是直接使陣列反轉,例如下面的栗子:

var arr = [1, 2, 3, 4, 5, -1, -10, 9, 0];

arr.reverse();

alert(arr);

//0, 9, -10, -1, 5, 4, 3, 2, 1

執行結果就是陣列的逆序,沒什麼好說的。

下面來詳細說一下sort()這個方法:

sort方法可以直接呼叫,不傳入任何引數,也可以傳入乙個比較函式作為引數,關於比較函式待會再解釋,下面先說不傳參的時候。

當不傳入引數的時候,sort()方法會呼叫預設的排序的方式,即先呼叫每個陣列項的tostring()轉型方法,然後按照字串unicode編碼順序來對字串進行排序,例如下面的栗子:

var arr = [1, 2, 3, 15, 22, 33];

arr.sort();

alert(arr);

//1, 15, 2, 22, 3, 33

輸出結果可能和想象中的不一樣,但是這是按照這些數字在unicode字符集中的順序進行排序的。

那麼怎麼才能讓他按照我們的想法對陣列進行排序呢?沒錯,就是傳入乙個函式作為引數,來指明排序方式。(注意,引數必須是函式,不能是其他的)

這個函式可以像下面這樣寫:

function cmp (value1, value2) 

else if (value1 > value2) else

}

還是解釋一下這個函式,如果value2大於value1,那麼就會返回1,即true,那麼就會執行交換,這樣就會把較大的value2放在前面,則較小value1就放在後面。這樣整體排下來就會是乙個從大到小的排序。下面是乙個實際應用的栗子:

var arr = [1, 2, 3, 15, 22, 33, 44, 55, 0, -1, 22, 55];

function cmp (value1, value2)

else if (value1 > value2) else

}arr.sort(cmp);

alert(arr);

執行結果:

還有一種簡化的cmp函式的書寫方法:

function cmp (a, b)
這個函式和上面的函式作用是相同的,當b比較大的時候,就會返回乙個大於等於1的數,即true,這樣就會執行交換,總體結果也是一種降序排序,可以自己寫**試一下。

那麼,現在實現了對陣列中的數字進行排序,那麼怎麼實現根據陣列物件中某個屬性值進行排序呢?

這裡就要用到js函式的乙個特點,就是用函式作為返回值,可以巢狀一層函式用來接收物件屬性名,表示按照哪個屬性進行排序:

有些人可能現在的cmp函式不太理解,那麼可以除錯一下這段**看看究竟發生了什麼:

可以看到,cmp函式中的property只是起到了標識的作用,而實際上arr中的資料是傳遞給了內部的function,然後由內部的function的引數來根據property來取得需要進行比較的值進行比較。

那麼sort函式內部是按照什麼排序方法進行排序的呢?看一下js實現sort方法的底層**就知道了:

javascript 學習隨筆 sort

sort 是乙個高階函式,預設排序是根據ascii碼進行排序的,即使你輸入的是數值,比如 10,20,1,2 但排序的結果是1,10,2,20,原因是因為他會把我們陣列中的數值預設轉成字串再進行排序,如果這個搞不清楚的話,你會遇到乙個大坑。還好 sort函式支援自定義函式,我們可以根據我們的需要定義...

javascript陣列的排序(sort,冒泡)

一 js的sort 方法 var arr 10,20,1,2 arr.sort function a,b return 0 console.log arr 1,2,10,20 如上面 按照正序 由小到大 排列。通常規定,如果ab,則返回1 如果a b,則返回0 倒序相反。var arr 10,20,...

陣列中sort 方法

今天更正了對陣列中sort 方法的錯誤認識。var values 0,1,5,10,15 values.sort console.log values 輸出0,1,10,15,5 以前一直認為結果應該是0,1,5,10,15,結果與事實不符。原來sort 方法是通過呼叫每個陣列項的tostring ...