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];
});
相关文章
相关标签/搜索