数组有两个方法可以用来对元素重新排序:reverse()和 sort()。顾名思义,reverse()方法就 是将数组元素反向排列。比如:

let values = [1, 2, 3, 4, 5];
    values.reverse();
    alert(values);  // 5,4,3,2,1

这里,数组 values 的初始状态为[1,2,3,4,5]。通过调用 reverse()反向排序,得到了 [5,4,3,2,1]。这个方法很直观,但不够灵活,所以才有了 sort()方法。

默认情况下,sort()会按照升序重新排列数组元素,即最小的值在前面,最大的值在后面。为此, sort()会在每一项上调用 String()转型函数,然后比较字符串来决定顺序。即使数组的元素都是数值, 也会先把数组转换为字符串再比较、排序。比如:

let values = [0, 1, 5, 10, 15];
    values.sort();
    alert(values);  // 0,1,10,15,5

一开始数组中数值的顺序是正确的,但调用 sort()会按照这些数值的字符串形式重新排序。因此, 即使 5 小于 10,但字符串"10"在字符串"5"的前头,所以 10 还是会排到 5 前面。很明显,这在多数情 况下都不是最合适的。为此,sort()方法可以接收一个比较函数,用于判断哪个值应该排在前面。

比较函数接收两个参数,如果第一个参数应该排在第二个参数前面,就返回负值;如果两个参数相 等,就返回 0;如果第一个参数应该排在第二个参数后面,就返回正值。下面是使用简单比较函数的一 个例子:

function compare(value1, value2) {
      if (value1 < value2) {
        return -1;
      } else if (value1 > value2) {
        return 1;
      } else {
return 0; }
}
1 2 3 4

这个比较函数可以适用于大多数数据类型,可以把它当作参数传给 sort()方法,如下所示:

let values = [0, 1, 5, 10, 15];
alert(values); // 0,1,5,10,15 5

在给 sort()方法传入比较函数后,数组中的数值在排序后保持了正确的顺序。当然,比较函数也 可以产生降序效果,只要把返回值交换一下即可:

values.sort(compare);
 function compare(value1, value2) {
  if (value1 < value2) {
return 1;
  } else if (value1 > value2) {
return -1;
  } else {
    return 0;
6
7
  } }8
let values = [0, 1, 5, 10, 15];
values.sort(compare);
alert(values);  // 15,10,5,1,0
此外,这个比较函数还可简写为一个箭头函数:
let values = [0, 1, 5, 10, 15];
values.sort((a, b) => a < b ? 1 : a > b ? -1 : 0);
alert(values); // 15,10,5,1,0

在这个修改版函数中,如果第一个值应该排在第二个值后面则返回 1,如果第一个值应该排在第二 个值前面则返回1。交换这两个返回值之后,较大的值就会排在前头,数组就会按照降序排序。当然, 如果只是想反转数组的顺序,reverse()更简单也更快。