在 JavaScript 中對整數陣列進行排序
介紹可用於按特定順序對陣列進行排序的 .sort
方法,本教程的目的是解釋為什麼要正確排序整數陣列時該方法需要比較函式。
此比較函式將指示排序順序。此外,我們將解釋如何使用它來進行降序排序,以及通過將比較函式用作 .sort
方法中的箭頭函式的更短的方法來一起使用它們。
在 JavaScript 中使用 .sort
方法對整數陣列進行排序
.sort
方法是 Array
實體的方法,它從最初呼叫此方法的陣列中返回一個有序陣列。例如:
// Input
let array = [10, 10000, 1000, 100, 1]
console.log(array.sort())
輸出:
// Output
[ 1, 10, 100, 1000, 10000 ]
當然,這是預期的,因為 .sort
方法對陣列進行排序。但是,如果我們有以下輸入:
// Input
let array = [12900, 877, 12, 992, 10000]
console.log(array.sort())
我們有這樣一個錯誤的順序:
// Output
[ 10000, 12, 12900, 877, 992 ]
這是因為 .sort
預設順序基於 UTF-16
或 16-bit Unit Transformation Format
,這是 Unicode 模式的編碼。該方法將陣列值轉換為字串型別,然後對它們的 Unicode 值進行排序。
有了這個解釋,.sort
方法也可以用於對其他資料型別進行排序,而不僅僅是數字。
但是如何使用 .sort
方法對陣列進行正確排序?很簡單:使用比較函式。
將比較函式作為引數傳遞
由於 .sort
方法可以在沒有任何引數的情況下使用,所以比較函式是可選的。基本上,這個函式定義了 .sort
方法的順序,這個函式接收兩個引數:第一個要比較的元素和第二個要比較的元素。
.sort
方法將:
- 如果
compareFunction
返回的值大於 0,則將first
放在second
之後; - 如果
compareFunction
返回的值小於 0,則將first
放在second
之前; - 如果
compareFunction
返回的值等於 0,則不執行任何操作。
因此,使用 compareFunction(first, second)
,我們可以通過在 first
和 second
引數之間傳遞操作來指定排序的順序。按升序排列,
// Ascending ordering
function compareFunction(first, second){
if(first > second) return 1 // 1 is greater than 0, so .sort will put first after second.
if(first < second) return -1 // -1 is less than 0, so .sort will put first before second.
return 0
}
對於降序,我們可以反轉運算子。
// Descending ordering
function compareFunction(first, second){
if(first < second) return 1 // 1 is greater than 0, so .sort will put first after second.
if(first > second) return -1 // -1 is less than 0, so .sort will put first before second.
return 0
}
現在,將用於升序排序的 compareFunction
與 .sort
方法放在一起,最後,我們有:
// Input:
let array = [12900, 877, 12, 992, 10000]
// Ascending
array.sort(function compareFunction(first, second){
if(first > second) return 1 // 1 is greater than 0, so .sort will put first before second.
if(first < second) return -1 // -1 is less than 0, so .sort will put first after second.
return 0
})
console.log(array)
輸出:
// Output:
[ 12, 877, 992, 10000, 12900 ]
在 JavaScript 中使用箭頭函式對整數陣列進行排序
我們還可以使用箭頭函式將所有程式碼塊減少到最小的語法。
箭頭函式是另一種使用語法較短的函式的方法。箭頭函式是匿名函式,這意味著它們沒有命名(儲存在變數中或作為函式引數傳遞)並且不能在所有情況下使用。
通過箭頭函式的結構,可以將傳統函式轉換為更短的塊,例如:
// Common anonymous function
function (x){
return x + 1;
}
// Arrow function
(x) => x + 1
除此之外,箭頭函式的結構可以自動返回表示式值而無需保留字 return
:
// Arrow function
let arrowFunction = (x) => x + 1
console.log(arrowFunction(1))
輸出:
//Output
2
console.log()
列印 1 + 1
的值,即 2
,即使 arrowFunction
沒有使用 return
語句。它將幫助我們進行下一步。
如前所述,.sort
方法中可以有一個比較函式,該函式可以是箭頭函式。轉換之前的比較函式結構,我們可以將所有程式碼塊轉換為更短的塊,如下所示:
// Input:
let array = [10000, 10, 100, 1000, 1]
array.sort((first, second) => {
if(first > second) return 1
return -1
})
// Ascending: If first > second == true, then change one by the other.
console.log(array)
我們可以將條件刪除為 first < second
,如果主要條件不是這種情況,則預設返回 -1
值;假設 .sort
方法的 0
值是相等的值,這樣,它們可以在不影響最終結果的情況下改變它們的位置。這樣,我們可以減少更多,如下例所示:
// Input:
let array = [10000, 10, 100, 1000, 1]
array.sort((first, second) => first > second ? 1 : -1)
// Ascending: If first > second == true, then change one by the other.
console.log(array)
看看之前的 >
比較和預設 return
已更改為僅一個比較:first > second ? 1 : -1
。這意味著如果比較為 true
,則返回 1
;如果不是,它返回 -1
。
我們需要 ?
三元運算子,因為 first > second
比較只會導致 true
或 false
。但如前所述,.sort
方法需要 1
、-1
或 0
。
輸出:
// Output:
[ 1, 10, 100, 1000, 10000 ]
對於降序:
// Input:
let array = [10000, 10, 100, 1000, 1]
array.sort((first, second) => first < second ? 1 : -1)
// Descending: If first < second == true, then change one by the other.
console.log(array)
輸出:
// Output:
[ 10000, 1000, 100, 10, 1 ]
另一種方法是使用 -
三元運算子進行減法。當我們使用 array.sort((first, second) => first > second ? 1 : -1)
時,如果 first - second
的結果大於 0,那麼將是一個相互變化的索引。如果 first - second
的結果小於 0,則不會發生任何事情,對於相等的值,比較將返回 0
。
例子:
// Input:
let array = [10000, 10, 100, 1000, 1]
console.log(array.sort((first, second) => first - second))
輸出:
// Output:
[ 1, 10, 100, 1000, 10000 ]
我們可以按降序做什麼?不,它不會將 -
三元運算子更改為+
,因為每個正數加上另一個正數會導致值大於 0。但是我們有一個簡單的解決方案:將 first - second
反轉為 第二 - 第一
。
這樣,如果 second - first
的結果大於 0,則 .sort 方法將彼此更改它們的位置。
例子:
// Input:
let array = [10000, 10, 100, 1000, 1]
console.log(array.sort((first, second) => second - first))
輸出:
// Output:
[ 10000, 1000, 100, 10, 1 ]