Array.prototype.sort()

總結

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)

See also

文件標籤與貢獻者

 此頁面的貢獻者: CYBAI
 最近更新: CYBAI,