js中的陣列物件排序

2021-08-28 06:57:02 字數 2812 閱讀 9407

js中用方法sort()為陣列排序。sort()方法有乙個可選引數,是用來確定元素順序的函式。如果這個引數被省略,那麼陣列中的元素將按照ascii字元順序進行排序。如:

var arr = ["a", "b", "a", "b"];

arr.sort();

console.log(arr);//["a", "b", "a", "b"]

因為字母a、b的ascii值分別為65、66,而a、b的值分別為97、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()方法的引數就起到了作用,我們把這個引數叫做比較函式。

比較函式接收兩個引數,如果第乙個引數應該位於第二個之前則返回乙個負數,如果兩個引數相等則返回0,如果第乙個引數應該位於第二個之後則返回乙個正數。例子:

var arr = [23, 9, 4, 78, 3];

var compare = function (x, y) else if (x > y) else

}console.log(arr.sort(compare));

(當js陣列中為字串時,如:["1","6","3","24","8"],這時需要在比較前加上parseint 如:

var arr = ["23", "9", "4", "78", "3"];

var compare = function (x, y) else if (parseint(x) > parseint(y)) else

}console.log(arr.sort(compare));

結果為 [3, 4, 9, 23, 78] ,返回了我們想要的結果。如果要按降序排序,比較函式寫成這樣即可:

var compare = function (x, y)  else if (x > y)  else 

}

我們並不能用比較函式比較乙個不能轉化為數字的字串與數字的順序:

var arr = ["b", 5];

console.log(arr.sort(compare))

結果是 ["b", 5] 。因為比較函式在比較時,會把先把字串轉化為數字,然後再比較,字串b不能轉化為數字,所以就不能比較大小。然而,當不用比較函式時,會比較ascii值,所以結果是 [5, "b"] 。

如果陣列項是物件,我們需要根據陣列項的某個屬性對陣列進行排序,要怎麼辦呢?其實和前面的比較函式也差不多:

var arr = [, ];

var compare = function (obj1, obj2) else if (val1 > val2) else

} console.log(arr.sort(compare));

輸出結果為 [object , object ] ,可以看到陣列已經按照 name 屬性進行了排序。我們可以對上面的比較函式再改造一下:

var compare = function (prop)  else if (val1 > val2)  else             

} }

如果想按照 age 進行排序, arr.sort(compare("age")) 即可。

但是對age屬性進行排序時需要注意了,如果age屬性的值是數字,那麼排序結果會是我們想要的。但很多時候我們從伺服器傳回來的資料中,屬性值通常是字串。現在我把上面的陣列改為:

var arr = [, ];
可以看到,我把 age 屬性由數字改為了字串,第二個陣列項的 age 值改為了 "5" 。再次呼叫 arr.sort(compare("age")) 後,結果為:

[object , object ]
我們的期望是5排在25前面,但是結果不是。這是因為當兩個數字字串比較大小時,會比較它們的ascii值大小,比較規則是:從第乙個字元開始,順次向後直到出現不同的字元為止,然後以第乙個不同的字元的ascii值確定大小。所以"24"與"5"比較大小時,先比較」2「與"5"的ascii值,顯然」2「的ascii值比"5"小,即確定排序順序。

現在,我們需要對比較函式再做一些修改:

var compare = function (prop) 

if (val1 < val2) else if (val1 > val2) else

} }

在比較函式中,先把比較屬性值轉化為數字 number(val1) 再通過 !isnan(number(val1)) 判斷轉化後的值是不是數字(有可能是nan),轉化後的值如果是數字,則比較轉換後的值,這樣就可以得到我們想要的結果了, 呼叫  arr.sort(compare("age")) 得到:

[object , object ]
可以看到,確實是按正確的方式排序了。

這篇文章所講的都是基礎的,沒什麼技術含量,只是最近專案中遇到了對陣列物件進行排序的問題,所以在這裡寫出來分享一下,相信總能幫到一些朋友。

js中的陣列物件排序

一 普通陣列排序 js中用方法sort 為陣列排序。sort 方法有乙個可選引數,是用來確定元素順序的函式。如果這個引數被省略,那麼陣列中的元素將按照ascii字元順序進行排序。如 var arr a b a b arr.sort console.log arr a b a b 因為字母a b的as...

js中的陣列物件排序

js中用方法sort 為陣列排序。sort 方法有乙個可選引數,是用來確定元素順序的函式。如果這個引數被省略,那麼陣列中的元素將按照ascii字元順序進行排序。如 var arr a b a b arr.sort console.log arr a b a b 因為字母a b的ascii值分別為65...

js陣列物件排序

function arritemsort arrobj,keyname,type 如果值為空的,放在最後 if val1 null val2 null else if val1 null val2 null else if val2 null val1 null 排序 if val1 val2 el...