JS實現數組排序:升序和降序

若是指明瞭 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 字符排序

當排序非 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];
});
相關文章
相關標籤/搜索