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,如下的函數將會將數組升序排列

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]

對象可以按照某個屬性排序:

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。這個函數可以將函數排序到正確的順序。

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];
});

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM