首頁  >  文章  >  web前端  >  分析JS中sort方法的使用及其原理

分析JS中sort方法的使用及其原理

零到壹度
零到壹度原創
2018-03-20 14:33:453739瀏覽

本文主要和大家分析JS中sort方法的使用及其原理,需要的朋友可以參考下,希望能幫助到大家。下面跟著小編一起來看看吧。

原生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) {
        if (value1 < value2) {
            return 1;
        }
        else if (value1 > value2) {
            return -1;
        } else {
            return 0;
        }
    }

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

    var arr = [1, 2, 3, 15, 22, 33, 44, 55, 0, -1, 22, 55];
    function cmp (value1, value2) {
        if (value1 < value2) {
            return 1;
        }
        else if (value1 > value2) {
            return -1;
        } else {
            return 0;
        }
    }
    arr.sort(cmp);
    alert(arr);

運行結果:


#還有一個簡化的cmp函數的書寫方法:

    function cmp (a, b) {
        return b - a;
    }

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

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

這裡就要用到JS函數的一個特點,就是用函數作為回傳值,可以嵌套一層函數用來接收物件屬性名,表示依照哪個屬性進行排序:

<script type="text/javascript">
    var arr = [
        { name: &#39;guo&#39;, age: 20},
        { name: &#39;yu&#39;, age: 19},
        { name: &#39;liu&#39;, age: 15}
    ];

    function cmp (property) {
        return function (a, b){
            var value1 = a[property];
            var value2 = b[property];

            return value1 - value2;
        }
    }
    arr.sort(cmp(&#39;age&#39;));
    for (var i=0; i<3; i++) {
        alert(arr[i].name);
    }
    //liu, yu, guo
</script>

有些人可能現在的cmp函數不太理解,那麼可以調試一下這段程式碼看看究竟發生了什麼:


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

以上是分析JS中sort方法的使用及其原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn