若是指明瞭 compareFunction
,那麼數組會按照調用該函數的返回值排序。即 a 和 b 是兩個將要被比較的元素:數組
compareFunction(a, b)
小於 0 ,那麼 a 會被排列到 b 以前;compareFunction(a, b)
等於 0 , a 和 b 的相對位置不變。備註: ECMAScript 標準並不保證這一行爲,並且也不是全部瀏覽器都會遵照(例如 Mozilla 在 2003 年以前的版本);compareFunction(a, b)
大於 0 , b 會被排列到 a 以前。compareFunction(a, b)
必須老是對相同的輸入返回相同的比較結果,不然排序的結果將是不肯定的。因此,比較函數格式以下:瀏覽器
function compare(a, b) { if (a < b ) { // 按某種排序標準進行比較, a 小於 b return -1; } if (a > b ) { return 1; } // a must be equal to b return 0; }
要比較數字而非字符串,比較函數能夠簡單的以 a 減 b,以下的函數將會將數組升序排列app
function compareNumbers(a, b) { //升序 return a - b; }
function compareNumbers(a, b) { //降序 return b-a; }
sort
方法可使用 函數表達式 方便地書寫:函數
var numbers = [4, 2, 5, 1, 3]; numbers.sort(function(a, b) { return a - b; }); console.log(numbers); 也能夠寫成: var numbers = [4, 2, 5, 1, 3]; numbers.sort((a, b) => a - b); console.log(numbers); // [1, 2, 3, 4, 5]
對象能夠按照某個屬性排序:spa
var items = [ { name: 'Edward', value: 21 }, { name: 'Sharpe', value: 37 }, { name: 'And', value: 45 }, { name: 'The', value: -12 }, { name: 'Magnetic' }, { name: 'Zeros', value: 37 } ]; // sort by value items.sort(function (a, b) { return (a.value - b.value) }); // sort by name items.sort(function(a, b) { var nameA = a.name.toUpperCase(); // ignore upper and lowercase var nameB = b.name.toUpperCase(); // ignore upper and lowercase if (nameA < nameB) { return -1; } if (nameA > nameB) { return 1; } // names must be equal return 0; });
當排序非 ASCII 字符的字符串(如包含相似 e, é, è, a, ä 等字符的字符串)。一些非英語語言的字符串須要使用 String.localeCompare
。這個函數能夠將函數排序到正確的順序。code
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é']
compareFunction
可能須要對元素作屢次映射以實現排序,尤爲當 compareFunction
較爲複雜,且元素較多的時候,某些 compareFunction
可能會致使很高的負載。使用 map 輔助排序將會是一個好主意。基本思想是首先將數組中的每一個元素比較的實際值取出來,排序後再將數組恢復。對象
// 須要被排序的數組 var list = ['Delta', 'alpha', 'CHARLIE', 'bravo']; // 對須要排序的數字和位置的臨時存儲 var mapped = list.map(function(el, i) { return { index: i, value: el.toLowerCase() }; }) // 按照多個值排序數組 mapped.sort(function(a, b) { return +(a.value > b.value) || +(a.value === b.value) - 1; }); // 根據索引獲得排序的結果 var result = mapped.map(function(el){ return list[el.index]; });