js中用方法sort()爲數組排序。sort()方法有一個可選參數,是用來肯定元素順序的函數。若是這個參數被省略,那麼數組中的元素將按照ASCII字符順序進行排序。如:數組
var arr = ["a", "b", "A", "B"]; arr.sort(); console.log(arr);//["A", "B", "a", "b"]
由於字母A、B的ASCII值分別爲6五、66,而a、b的值分別爲9七、98,因此上面輸出的結果是 ["A", "B", "a", "b"] 。服務器
若是數組元素是數字呢,結果會是怎樣?函數
var arr = [15, 8, 25, 3]; arr.sort(); console.log(arr);//[15, 25, 3, 8]
結果是 [15, 25, 3, 8] 。其實,sort方法會調用每一個數組項的toString()方法,獲得字符串,而後再對獲得的字符串進行排序。雖然數值15比3大,但在進行字符串比較時"15"則排在"3"前面。顯然,這種結果不是咱們想要的,這時,sort()方法的參數就起到了做用,咱們把這個參數叫作比較函數。spa
比較函數接收兩個參數,若是第一個參數應該位於第二個以前則返回一個負數,若是兩個參數相等則返回0,若是第一個參數應該位於第二個以後則返回一個正數。例子:對象
var arr = [23, 9, 4, 78, 3]; var compare = function (x, y) {//比較函數 if (x < y) { return -1; } else if (x > y) { return 1; } else { return 0; } } console.log(arr.sort(compare));
結果爲 [3, 4, 9, 23, 78] ,返回了咱們想要的結果。若是要按降序排序,比較函數寫成這樣便可:排序
var compare = function (x, y) { if (x < y) { return 1; } else if (x > y) { return -1; } else { return 0; } }
咱們並不能用比較函數比較一個不能轉化爲數字的字符串與數字的順序:字符串
var arr = ["b", 5]; console.log(arr.sort(compare))
結果是 ["b", 5] 。由於比較函數在比較時,會把先把字符串轉化爲數字,而後再比較,字符串b不能轉化爲數字,因此就不能比較大小。然而,當不用比較函數時,會比較ASCII值,因此結果是 [5, "b"] 。io
若是數組項是對象,咱們須要根據數組項的某個屬性對數組進行排序,要怎麼辦呢?其實和前面的比較函數也差很少:console
var arr = [{name: "zlw", age: 24}, {name: "wlz", age: 25}]; var compare = function (obj1, obj2) { var val1 = obj1.name; var val2 = obj2.name; if (val1 < val2) { return -1; } else if (val1 > val2) { return 1; } else { return 0; } } console.log(arr.sort(compare));
輸出結果爲 [Object { name="wlz", age=25}, Object { name="zlw", age=24}] ,能夠看到數組已經按照 name 屬性進行了排序。咱們能夠對上面的比較函數再改造一下:function
var compare = function (prop) { return function (obj1, obj2) { var val1 = obj1[prop]; var val2 = obj2[prop];if (val1 < val2) { return -1; } else if (val1 > val2) { return 1; } else { return 0; } } }
若是想按照 age 進行排序, arr.sort(compare("age")) 便可。
可是對age屬性進行排序時須要注意了,若是age屬性的值是數字,那麼排序結果會是咱們想要的。但不少時候咱們從服務器傳回來的數據中,屬性值一般是字符串。如今我把上面的數組改成:
var arr = [{name: "zlw", age: "24"}, {name: "wlz", age: "5"}];
能夠看到,我把 age 屬性由數字改成了字符串,第二個數組項的 age 值改成了 "5" 。再次調用 arr.sort(compare("age")) 後,結果爲:
[Object { name="zlw", age="24"}, Object { name="wlz", age="5"}]
咱們的指望是5排在25前面,可是結果不是。這是由於當兩個數字字符串比較大小時,會比較它們的ASCII值大小,比較規則是:從第一個字符開始,順次向後直到出現不一樣的字符爲止,而後以第一個不一樣的字符的ASCII值肯定大小。因此"24"與"5"比較大小時,先比較」2「與"5"的ASCII值,顯然」2「的ASCII值比"5"小,即肯定排序順序。
如今,咱們須要對比較函數再作一些修改:
var compare = function (prop) { return function (obj1, obj2) { var val1 = obj1[prop]; var val2 = obj2[prop]; if (!isNaN(Number(val1)) && !isNaN(Number(val2))) { val1 = Number(val1); val2 = Number(val2); } if (val1 < val2) { return -1; } else if (val1 > val2) { return 1; } else { return 0; } } }
在比較函數中,先把比較屬性值轉化爲數字 Number(val1) 再經過 !isNaN(Number(val1)) 判斷轉化後的值是否是數字(有多是NaN),轉化後的值若是是數字,則比較轉換後的值,這樣就能夠獲得咱們想要的結果了, 調用 arr.sort(compare("age")) 獲得:
[Object { name="wlz", age="5"}, Object { name="zlw", age="24"}]
能夠看到,確實是按正確的方式排序了。
這篇文章所講的都是基礎的,沒什麼技術含量,只是最近項目中遇到了對數組對象進行排序的問題,因此在這裏寫出來分享一下,相信總能幫到一些朋友。