---
# System prepended metadata

title: sort

---

#  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']
```