總結
sort()
方法將陣列中的元素排列至其應當的位置上並返回此陣列。排列不必是穩定的。預設的排列順序根據Unicode字串碼位來排序。
語法
arr.sort([compareFunction])
參數
-
compareFunction
- 可選。指定一函數來定義排序順序。若省略,陣列將根據各個字元的Unicode碼位值排列,或根據每個元素轉換為字串。
敘述
如果 compareFunction
沒有被應用, 元素將被轉換為字串並以Unicode碼位來比較並排序。舉例來說,"Cherry"在"banana"前面。在數值排序中,9在80前面,但因為數字被轉換成字串,在Unicode順序中"80"在"9"前面。
var fruit = ['apples', 'bananas', 'Cherries']; fruit.sort(); // ['Cherries', 'apples', 'bananas']; var scores = [1, 2, 10, 21]; scores.sort(); // [1, 10, 2, 21] var things = ['word', 'Word', '1 Word', '2 Words']; things.sort(); // ['1 Word', '2 Words', 'Word', 'word'] // 在Unicode中, 數字在大寫字母前, // 大寫字母在小寫字母前
如果 compareFunction
被應用, 陣列元素們將根據比較函數之回傳值來排序。如果 a
和 b
為被比較之兩元素, 則:
- 若
compareFunction(a, b)
小於 0, 將a
排在比b index還小處
, i.e.a
排在第一個. - 若
compareFunction(a, b)
回傳 0,a
與b
互相不會改變順序, 但會與全部其他元素比較排列。註計: ECMAscript標準不保證能使用此行為, 因此不是所有瀏覽器 (e.g. Mozilla版本至少2003) 遵守此行為. - 若
compareFunction(a, b)
大於 0, 將b
排在比a index還小處
. compareFunction(a, b)
在給特定元素 a 及 b 為此函數之兩參數時必須每次都回傳相同之值。若回傳值不一致,排序順序則為undefined。
所以, 比較函數為以下之形式:
function compare(a, b) { if (在某排序標準下 a 小於 b) { return -1; } if (在某排序標準下 a 大於 b) { return 1; } // a 必須等於 b return 0; }
為了比較數字而不是字串, 比較函數可以僅僅利用 a 減 b。以下函數將會將升冪排列陣列:
function compareNumbers(a, b) { return a - b; }
sort
方法可以直接使用 function expressions (和 closures):
var numbers = [4, 2, 5, 1, 3]; numbers.sort(function(a, b) { return a - b; }); print(numbers);
物件可以利用其中一個屬性的值來排序。
var items = [ { name: 'Edward', value: 21 }, { name: 'Sharpe', value: 37 }, { name: 'And', value: 45 }, { name: 'The', value: -12 }, { name: 'Magnetic' }, { name: 'Zeros', value: 37 } ]; items.sort(function (a, b) { if (a.name > b.name) { return 1; } if (a.name < b.name) { return -1; } // a must be equal to b return 0; });
範例
範例: 創造, 顯示, 及排列一個陣列
下列範例創造四個陣列, 顯示其原始陣列, 並排序。數字陣列先不依據比較函數排序, 接著依據比較函數。
var stringArray = ['Blue', 'Humpback', 'Beluga']; var numericStringArray = ['80', '9', '700']; var numberArray = [40, 1, 5, 200]; var mixedNumericArray = ['80', '9', '700', 40, 1, 5, 200]; function compareNumbers(a, b) { return a - b; } // again, assumes a print function is defined console.log('stringArray:', stringArray.join()); console.log('Sorted:', stringArray.sort()); console.log('numberArray:', numberArray.join()); console.log('Sorted without a compare function:', numberArray.sort()); console.log('Sorted with compareNumbers:', numberArray.sort(compareNumbers)); console.log('numericStringArray:', numericStringArray.join()); console.log('Sorted without a compare function:', numericStringArray.sort()); console.log('Sorted with compareNumbers:', numericStringArray.sort(compareNumbers)); console.log('mixedNumericArray:', mixedNumericArray.join()); console.log('Sorted without a compare function:', mixedNumericArray.sort()); console.log('Sorted with compareNumbers:', mixedNumericArray.sort(compareNumbers));
這個範例將產生下列結果。就如結果所示, 當使用比較函數時, 數字將被正確的排序, 不管是數字或是數字字串。
stringArray: Blue,Humpback,Beluga Sorted: Beluga,Blue,Humpback numberArray: 40,1,5,200 Sorted without a compare function: 1,200,40,5 Sorted with compareNumbers: 1,5,40,200 numericStringArray: 80,9,700 Sorted without a compare function: 700,80,9 Sorted with compareNumbers: 9,80,700 mixedNumericArray: 80,9,700,40,1,5,200 Sorted without a compare function: 1,200,40,5,700,80,9 Sorted with compareNumbers: 1,5,9,40,80,200,700
範例: 排列非ASCII字元
為了排列非ASCII字元, i.e. 重音節字元 (e, é, è, a, ä, etc.), 非英語字串: 利用 String.localeCompare
。 此函數將比較這些字元所以結果將會顯示正確順序。
var items = ['réservé', 'premier', 'cliché', 'communiqué', 'café', 'adieu']; items.sort(function (a, b) { return a.localeCompare(b); }); // items is ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']
範例: 排列 maps
compareFunction
可以在陣列中各個元素被多次調用。依據 compareFunction 的特性
, 這將會產生大量運算。越多元素要排序 compareFunction
就越多工作要做, 因此選擇使用 map 來排列也就是一個更明智的選擇。作法為先遍歷陣列一次來取得排列所需的值至暫時的陣列, 並排列此暫時陣列。然後遍歷暫時陣列來將正確順序之值放入原始陣列。
// the array to be sorted var list = ['Delta', 'alpha', 'CHARLIE', 'bravo']; // temporary holder of position and sort-value var map = list.map(function(e, i) { return { index: i, value: e.toLowerCase() }; }) // sorting the map containing the reduced values map.sort(function(a, b) { return +(a.value > b.value) || +(a.value === b.value) - 1; }); // container for the resulting order var result = map.map(function(e){ return list[e.index]; });
規格
規格 | 狀態 | 註解 |
---|---|---|
ECMAScript 1st Edition | 標準 | 初始定義. |
ECMAScript 5.1 (ECMA-262) The definition of 'Array.prototype.sort' in that specification. |
Standard | |
ECMAScript 6 (ECMA-262) The definition of 'Array.prototype.sort' in that specification. |
Draft |
瀏覽器相容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 1.0 | 1.0 (1.7 or earlier) | 5.5 | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |