• <JavaScript>数组的sort()方法中比较函数是怎么工作的


    sort()函数比较时调用的是每个数组项的toString()方法,并非按数值大小进行比较,所以往往得不到我们想要的结果。

        比如:

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

    数值5虽然小于10,但进行字符串比较时,“10”则位于“5”的前面。所以,这种排序很多情况下都不是最佳方案。为了解决这个问题,sort()函数可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。比较函数接收两个参数,有如下规则:(1)如果第一个参数该位于第二个参数之前,则返回一个负数;(2)如果两个参数相等,返回0;(3)如果第一个参数应该位于第二个参数之后则返回一个正数(注意:是确定参数!参数!参数!的前后顺序)。

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

         以题目中的给出的函数为例,

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

         刚开始,value1=0,value2=1;传入函数compare (value1,value2)中,很明显value1<value2, 则compare函数返回1,sort()函数接收到数值1之后,根据上文中的规则(3)则第一个参数value1应该位于第二个参数value2之后,变成 value2、value1,和参数的传入顺序value1,value2相比,则交换了两个参数的位置,即 1,0,所以是降序排列

        比较15和10 时,参数value1=15,参数value2=10,value1>value2,compare()函数return -1;位置不交换,所以15的位置在10之前。

        总结:如果返回的是正数则两个数需要交换,反之则不需要交换。

     【个人觉得,重点是理解:所谓的交换与否,是针对排序后两个参数的位置与排序前两个参数的位置而言的。】

  • 相关阅读:
    T-Sql语法:行转列(pivot)和列转行(unpivot)
    T-Sql语法:GROUP BY子句GROUPING SETS、CUBE、ROLLUP
    Asp.net使用Plupload上传组件详解
    form标签属性enctype之multipart/form-data请求详解
    基于Owin Oauth2构建授权服务器
    AutoFac使用~IOC容器(DIP,IOC,DI)
    第二节:模型(Models)和管理后台(Admin site)
    第三节:视图(Views)和模板(Templates)
    THINKPHP 3.2 PHP SFTP上传下载 代码实现方法
    Linux 上导出导入sql文件到服务器命令
  • 原文地址:https://www.cnblogs.com/isAndyWu/p/11490322.html
Copyright © 2020-2023  润新知