# sort
### Array.prototype.sort()
* 根據MDN解釋 sort() 會原地(in place)對一個陣列的所有元素進行排序,且回傳給我們排好序的陣列。
* 預設的排序順序是根據字串的 Unicode 編碼位置(code points)而定。
```javascript=
let arr1 = [null, 2, 8, undefined, NaN, 200, "Hi", "apple", "", "#", "!", "2"];
arr1.sort();
console.log(arrr1);
// [ '', '!', '#', '2', 2, 200, 8, 'Hi', NaN, 'apple', null, undefined ]
```
sort()會將所有元素轉成字串後,且以第一個字元為對象,再進行排序,而所有符號會被先篩選出來,接著是數字,然後是字母。也因為這樣的比較,所以連200都會排在8前面。而字母則以字母大寫為先、小寫為後來排序。
* 語法: arr.sort([compareFunction])
# 用匿名函式當排序條件
- 如果希望完全依照自己給的條件排序,最好是給sort()一個帶有條件的匿名函式來當參數,這個匿名函數必須要有兩個參數,然後再依照這兩個參數比較回傳的值,來當排序依據。
- sort()會依匿名函式的參數與回傳的值為精確的排序規則:
當回傳值為負數時,那麼前面的數放在前面
當回傳值為正整數,那麼後面的數在前面
當回傳值為零,保持不動。
### 寫法一
```javascript=
const arr = [5, 9, 1, 3, 2, 6];
// 升序
arr.sort(function(a, b) {
if(a > b){
return 1; // 正數時,後面的數放在前面
} else {
return -1 // 負數時,前面的數放在前面
}
});
// 降序
arr.sort(function(a, b) {
if(a < b){
return 1; // 正數時,後面的數放在前面
} else {
return -1 // 負數時,前面的數放在前面
}
});
```
### 寫法二(寫法一精簡版)
```javascript=
const arr = [5, 9, 1, 3, 2, 6];
// 以匿名函式回參數做「升序」排序
arr.sort(function(a, b) {
return a - b; // a - b > 0
});
// [1, 2, 3, 5, 6, 9]
// 如果要反過來做「降序」排序
arr.sort(function(a, b) {
return b - a;
});
// [9, 6, 5, 3, 2, 1]
```
# 可以拿 sort 來做什麼?
* 按照字串長度來排序
```javascript=
const arr = ["hi", "Hello", "Bonjour", "ciao"];
arr.sort(function(a,b) {
return a.length - b.length;
});
console.log(arr);
// ["hi", "ciao", "Hello", "Bonjour"]
```
* 對字串做不區分大小寫的排序
sort()的預設會以 Unicode 來排序,而在 Unicode 的排序裡,大寫字母又會比小寫前面,但當我們要對有大小寫混雜的字串陣列做排序時,如何做到不區分大小寫的排序?可參考下列的方式,先把字串全轉成小寫再比對,就可以得到不分大小寫的排序
```javascript=
arr =["apple", "grape", "Ege", "coco", "Banana"];
// 直接預設排序的結果
arr.sort(); // ['Banana', 'Ege', 'apple', 'coco', 'grape']
arr.sort(function(x, y){
let a = x.toLowerCase();
let b = y.toLowerCase();
if(a>b){
return 1;
}else {
return -1;
}
});
// ['apple', 'Banana', 'coco', 'Ege', 'grape']
```