# Compare Function 比較函式
比較函數是 JavaScript 中用於控制排序順序的重要工具,通常與數組的 `.sort()` 方法結合使用。
比較函數是一個函數,接受兩個參數(通常命名為 `a` 和 `b`),並返回一個數字,該數字決定了這兩個參數的相對順序。
以下是關於比較函數的重要概念:
1. **返回值規則**:比較函數必須返回一個數字,該數字可正可負可零,具體表示如下:
- 如果返回負數,意味著 `a` 應該在 `b` 之前,即 `a` 排在 `b` 的前面。
- 如果返回零,意味著 `a` 和 `b` 位置相對不變,它們相等。
- 如果返回正數,意味著 `b` 應該在 `a` 之前,即 `b` 排在 `a` 的前面。
2. **排序用途**:比較函數通常與數組的 `.sort()` 方法一起使用,用於確定數組中元素的排序順序。 `.sort()` 方法會調用比較函數來決定元素的相對位置。
3. **升序排序**:要實現升序排序,比較函數應返回 `a - b`,其中 `a` 和 `b` 是要比較的元素。如果`a` 大於`b`,則返回正數,`a` 排在`b` 的後面;如果`a` 小於`b`,則返回負數,`a` 排在`b` 的前面;如果它們相等,返回零。
4. **降序排序**:要實現降序排序,比較函數應返回 `b - a`,這與升序排序相反。這將導致 `b` 大於 `a` 時返回正數,`b` 排在 `a` 的前面,從而實現降序排序。
5. **自定義排序規則**:比較函數允許您自定義排序規則,不僅限於數字,也可以用於字符串、日期等各種數據類型的排序。
## 使用方式
```javascript
const numbers = [3, 1, 5, 2, 4];
// 升序排序
const ascendingOrder = numbers.sort((a, b) => a - b);
console.log(ascendingOrder); // 輸出 [1, 2, 3, 4, 5]
// 降序排序
const descendingOrder = numbers.sort((a, b) => b - a);
console.log(descendingOrder); // 輸出 [5, 4, 3, 2, 1]
```
## 相關練習
#### Leetcode 2724
Sort By
給定一個數組“arr”和一個函數“fn”,返回一個排序數組“sortedArr”。
Given an array `arr` and a function `fn`, return a sorted array `sortedArr`.
您可以假設“fn”僅返回數字,並且這些數字決定“sortedArr”的排序順序。
You can assume `fn` only returns numbers
and those numbers determine the sort order of `sortedArr`.
`sortedArray` 必須按 `fn` 輸出升序排序。
`sortedArray` must be sorted in ascending order by `fn` output.
您可能會假設“fn”永遠不會重複給定數組的數字。
You may assume that `fn` will never duplicate numbers for a given array.
#### 解決方案
根據函數 fn 的返回值對數組 arr 進行升序排序,並返回排序後的新數組。
```javascript
const sortBy =function(arr, fn) {
//排序的邏輯
return arr.slice().sort((a, b) => fn(a) - fn(b));
}
```
- __arr.slice()__
沒有傳遞任何參數時,將返回原始數組 arr 的淺拷貝(shallow copy),這是一種常用於復制數組的方法。
這意味著它會創建一個新數組,包含原數組中的所有元素,並將這些元素複製到新數組中,但不會影響原始數組。
- __.sort((a, b) => fn(a) - fn(b))__
陣列的 sort 方法,該方法接受一個比較函數作為參數。
計算了fn(a) - fn(b)這兩個返回值的差值,這將成為排序的依據。
=> 如果差值為負數,則 a 應該排在 b 前面,
如果差值為正數,則 b 應該排在 a 前面,
如果差值為零,則它們保持相對順序不變。 最後,函數返回了排序後的新數組。