JS数组的重排序方法/reverse()和sort()

1,552 阅读3分钟

在数组中存在着两个自身的重排序的方法:reverse()和sort()。当然,只有这两个方法还不足排序所有类型的数组,还可以定义一些比较函数来结合以上两个方法实现对数组的重排序。

  • reverse() 颠倒数组中元素的顺序
  • sort() 对数组的元素进行排序
  • 定义比较函数 实现对数值类型或者其valueOf()方法会返回数值类型的对象类型

reverse()

reverse() 方法会反转数组的数组项的排序,该方法会改变原来的数组,而不会创建新的数组。

代码实现及效果如下:

var value = [1,2,3,4,5,9,2];
var value1 = [a,b,c,d,e,b];
value.reverse();
value1.reverse();
alert(value);     //2,9,5,4,3,2,1
alert(value1);    //b,e,d,c,b,a

输出的结果是反转了数组项的顺序,这个方法相当直观明了,但是不够灵活。

sort()

在默认的情况下,sort()方法按升序排列数组项——及最小的值在最前面,最大的值在后面。为了实现排序,sort()方法会调用每个数组的toString() 转型方法,然后比较字符串,以确认如何排序。值得注意的是,即使数组中每一项都是数值,sort() 方法比较的都是字符串,说的更具体一点先将数组的元素都转换成字符串,然后是按照字符编码的顺序进行排序。

var value = [0,1,5,10,15];
value.reverse();
alert(value);     //0,1,10,15,5

由例子可见,即使顺序本来是没有问题的,但是使用了sort() 方法也会根据字符串的结果改变原来的顺序。因为数值5虽然小于10,但是在进行字符串比较时,"5"位于"10"的后面,所以数组的顺序就被修改了。
使用sort() 方法在排列纯数值的数组的时候,并不是什么好方案,这时候就要接收一个比较函数作为参数,使得能正确的排列数值的数组。

比较函数

比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回0,如果第一个参数应该位于第二个之后则返回一个正数

升序的代码如下所示:

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

这个函数可以适用于大多数的数据类型,只要将其作为参数传递sort() 方法即可,如下所示:

var values = [1,3,4,6,5,2,8];
values.sort(compare);
alert(values);     //1,2,3,4,5,6,8

当然这个是升序的排列数组,想要实现降序,有两种方法。

  • 一是可以直接对以上这个升序后的数组使用reverse() 方法,再输出结果,就已经是降序的效果了,如何使用已经在前面讲过了,就不演示了;
  • 二是对比较函数做出一点修改,把返回值交换一下,交换了返回值就已经让更大的值排位在前了,也就是实现了降序。 代码如下:
function compare(value1,value2){
    if(value1 < value2){
        return 1;
    }else if(value1 > value2){
        return -1;
    }else{
        return 0;
    }
}

简化版: emmm这个是一个更简单的比较函数,由于比较函数是通过返回一个小于零、大于零或等于零的值来影响排序结果,因此一个简单的减法操作就可以适当的处理中数值数组排序的情况。 升序的代码如下:

function compare(value1,value2){
    return value1 - value2;
}

降序的代码如下:

function compare(value1,value2){
    return value2 - value1;
}