若是指明了 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]; });