排序数组

.sort() 方法对数组的元素进行排序。默认方法将根据字符串 Unicode 代码点对数组进行排序。要以数字方式对数组进行排序,.sort() 方法需要传递一个 compareFunction

注意: .sort() 方法不纯。.sort() 将对数组进行就地排序,即,不是创建原始数组的排序副本,而是重新排序原始数组并返回它。

默认排序

按 UNICODE 顺序对数组进行排序。

['s', 't', 'a', 34, 'K', 'o', 'v', 'E', 'r', '2', '4', 'o', 'W', -1, '-4'].sort();

结果是:

[-1, '-4', '2', 34, '4', 'E', 'K', 'W', 'a', 'l', 'o', 'o', 'r', 's', 't', 'v']

注意: 大写字符已移至小写字母以上。数组不按字母顺序排列,数字不按数字顺序排列。

按字母排序

['s', 't', 'a', 'c', 'K', 'o', 'v', 'E', 'r', 'f', 'l', 'W', '2', '1'].sort((a, b) => {
  return a.localeCompare(b);        
});

结果是:

['1', '2', 'a', 'c', 'E', 'f', 'K', 'l', 'o', 'r', 's', 't', 'v', 'W']

注意: 如果任何数组项不是字符串,则上述排序将引发错误。如果你知道数组可能包含非字符串的项目,请使用下面的安全版本。

['s', 't', 'a', 'c', 'K', 1, 'v', 'E', 'r', 'f', 'l', 'o', 'W'].sort((a, b) => {
  return a.toString().localeCompare(b);      
});

按长度排序的字符串(最长的第一个)

["zebras", "dogs", "elephants", "penguins"].sort(function(a, b) {
  return b.length - a.length;
});

结果是

["elephants", "penguins", "zebras", "dogs"];

按长度排序的字符串(最短的第一个)

["zebras", "dogs", "elephants", "penguins"].sort(function(a, b) {
  return a.length - b.length;
});

结果是

["dogs", "zebras", "penguins", "elephants"];

数字排序(升序)

[100, 1000, 10, 10000, 1].sort(function(a, b) {
  return a - b;
});

结果是:

[1, 10, 100, 1000, 10000]

数字排序(降序)

[100, 1000, 10, 10000, 1].sort(function(a, b) {
  return b - a;
});

结果是:

[10000, 1000, 100, 10, 1]

按偶数和奇数排序数组

[10, 21, 4, 15, 7, 99, 0, 12].sort(function(a, b) {
    return (a & 1) - (b & 1) || a - b;
});

结果是:

[0, 4, 10, 12, 7, 15, 21, 99]

日期排序(降序)

var dates = [
  new Date(2007, 11, 10),
  new Date(2014, 2, 21),
  new Date(2009, 6, 11),
  new Date(2016, 7, 23)
];

dates.sort(function(a, b) {
  if (a > b) return -1;
  if (a < b) return 1;
  return 0;
});

// the date objects can also sort by its difference
// the same way that numbers array is sorting
dates.sort(function(a, b) {
  return b-a;
});

结果是:

[
  "Tue Aug 23 2016 00:00:00 GMT-0600 (MDT)",
  "Fri Mar 21 2014 00:00:00 GMT-0600 (MDT)",
  "Sat Jul 11 2009 00:00:00 GMT-0600 (MDT)",
  "Mon Dec 10 2007 00:00:00 GMT-0700 (MST)"
]