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