JS數組排序方法有兩個: reverse() sort() reverse() sort()
和
,其中
可将數組進行倒序,而
則可将數組項靈活地進行升序或降序排列。
一、reverse()
var arr = [8,4,9,1];
console.log(arr.reverse()); // [1, 9, 4, 8]
console.log(arr); // [1, 9, 4, 8]
可以看出,
reverse()
會直接改變原數組,并且傳回值也是倒序後的數組。
二、sort()
記得當年學C語言時,要學各種各樣的排序算法,比如經典的冒泡排序法、二分排序法等,現在抛開這些算法不說,JS就自帶原生的排序函數,用起來非常友善,它就是
sort()
。
1. 不傳參數
var arr = [8,4,9,1];
console.log(arr.sort()); // [1, 4, 8, 9]
console.log(arr); // [1, 4, 8, 9]
sort()
不傳參數時會按升序方式對數組項進行排序,并且與
reverse()
一樣既改變原數組,同時傳回的也是排序後的數組。
我們再來看下一個例子:
var arr = [8,90,9,16];
console.log(arr.sort()); // [16, 8, 9, 90]
這時你可能會說,不對呀,最終排序傳回的不應該是
[8, 9, 16, 90]
嗎?然鵝事實傳回的卻是
[16, 8, 9, 90]
,這到底是哪門子邏輯?
事實上,
sort()
并不是按照數值進行排序,而是按字元串字母的ASCII碼值進行比較排序的,是以當數組項為數字時,
sort()
也會自動先将數字轉換成字元串,然後再按字母比較的規則進行排序處理。
現在我們再回頭看看前面兩個例子。當
arr
為
[8,4,9,1]
時,數組每一項轉換成字元串後進行排序的結果正好與數字排序結果相同;而當
arr
[8,90,9,16]
時,數組每一項轉換成字元串後就得按順序一位一位進行比較,比如升序排序時,“16”應該排在最前面,因為“16”的第一位是“1”,比“8”和“9”的ASCII碼值都要小。
啰嗦了這麼多,其實我們實際很少會使用這種排序方式,而更多的應該就是純數字的排序。那麼我們該如何正确地使用
sort()
來達到預期的排序效果呢?
接下來就來看看傳參後的
sort()
能給我們怎樣的精彩表現。
2. 傳入一個函數
這個函數參數功能其實很簡單,實際上就是告訴
sort()
排序方式到底是升序還是降序,我們還是來看具體執行個體吧~
var arr = [8,90,9,16];
// 升序
console.log(arr.sort(function (a, b) {
return a - b;
})); // [8, 9, 16, 90]
// 降序
console.log(arr.sort(function (a, b) {
return b - a;
})); // [90, 16, 9, 8]
這種用法的規則是,當
sort()
傳入函數中的第一個參數a位于第二個參數b之前,則傳回一個負數,相等則傳回0,a位于b之後則傳回正數。
比如,當要做升序排序時,我們需要想到前面的數肯定是要比後面的數小,是以傳入的這個函數參數傳回值應該要是個負數,是以函數參數傳回
a - b
如果實在不好了解,我們可以幹脆記下來,
a - b
升序,
b - a
降序,但是需要注意的是,如果按照這種記憶方式的話,函數括号内的兩個參數
a
b
的書寫順序可不能颠倒哦~
本文重點總結:
① sort() 不傳參時預設為升序,且是按字元串比較的方式排序;傳參時,其參數為函數,且該函數帶倆參數
a 和 b,傳回值 a - b 為升序,b - a為降序
② reverse() 和 sort() 兩函數均會改變原數組,且傳回值同樣也是改變後的數組