JavaScript之数组排序

    数组中已经存在两个重排序方法:reverse()和sort()。

    我们先来看下比较简单的reverse()方法: reverse()将数组项的顺序进行反转。

 var numList1=[1,2,3,4,5,6];
 numList1.reverse();
 console.log(numList1);//[6, 5, 4, 3, 2, 1] 

    此方法简单明了,但也不够灵活。
    接下来我们看sort()方法:sort()默认按照数组升序排列数组。

    sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定如何排序。

 var numList1=[1,5,25,12,20,10];
 numList1.sort();
 console.log(numList1);//[1, 10, 12, 20, 25, 5]虽然数值5小于除1以外的其他数值,但是在进行字符串比较时,"5"则位于其他字符串值的后面

     这种排序方法很不理想,但是sort()方法可以接受一个比较函数来自定义数组的排序方法。
     比较函数接受两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回0,如果第一个参数应该位于第二个之后则返回一个正数。

 function compare(a,b){
    if(a<b){
       return -1;
    }else if(a>b){
       return 1;
    }else{
       return 0;
    }
 }
 var numList1=[1,5,25,12,20,10];
 numList1.sort(compare);
 console.log(numList1);//[1, 5, 10, 12, 20, 25] 嗯,完美!

     我们也可以将该排序方法优化一下

    function compare(a,b){
        return a-b;
    }
    var numList1=[1,5,25,12,20,10];
    numList1.sort(compare);
    console.log(numList1);//[1, 5, 10, 12, 20, 25]

    由于比较函数通过返回一个小于零、等于零或大于零的值来影响排序结果,因此减法操作就可以适当地处理所有这些情况。接下来,我们来看下包含对象的数组排序:

var objectList=[{name:"北京",value:89},{name:"上海",value:96},{name:"深圳",value:67},{name:"广州",value:73}];
    如果需要按value值的大小进行升序排序呢?很简单,只需要将排序方法变化一下即可:
    function compare(a,b){
        return a.value-b.value;
    }
    var objectList=[{name:"北京",value:89},{name:"上海",value:96},{name:"深圳",value:67},{name:"广州",value:73}];
    objectList.sort(compare);
    console.log(objectList);//[{name:"深圳",value:67},{name:"广州",value:73},{name:"北京",value:89},{name:"上海",value:96}]
    但是如果此时出现脏数据,比如某个项的value值为null或者为 " " 呢?
    function compare(a,b){
        return a.value-b.value;
    }
    var objectList=[{name:"北京",value:89},{name:"上海",value:96},{name:"深圳",value:67},{name:"广州",value:null}];
    objectList.sort(compare);
    console.log(objectList);//[{name:"广州",value:null},{name:"深圳",value:67},{name:"北京",value:89},{name:"上海",value:96}]
    这里可以看出,在value值为null的情况下,sort在对其进行排序的时候,会调用函数Number()方法,先将其转换为数值再排序。
 
 以下给出Number()函数的转换规则:
  1.如果是Boolean值,true和false将分别转换为1和0。
  2.如果是数字值,只是简单的传入和返回。
  3.如果是null值,返回0。
  4.如果是undefined,返回NaN(非数值)。
  5.如果是字符串,遵循以下规则:
    a.如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即"1"会变成1,"123"会变成123,而"011"会变成11(前导零被忽略);
    b.如果字符串中包含有效的浮点格式,如"1.1"则将其转换为对应的浮点数值(同样,也会忽略前导零);
    c.如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
    d.如果字符串是空的(不包含任何字符),则将其转换为0;
    e.如果字符串中包含除上述格式之外的字符,则将其转换为NaN;
  6.如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值