• 解析JavaScript中的sort()排序方法以及原理


    Array.sort()方法将数组中的元素进行排序,返回排序后的数组,默认是按照升序排序的。sort方法会调用数组中每一项的toString()方法,然后按照ascii编码进行排序,如果数组含有undefined元素,它们将会被排到尾部。

    demo1:

    var arr=[3,4,6,8,7];
        arr.sort();
        console.log(arr); //=>[3, 4, 6, 7, 8]

    以上是一个很简单的数字排序例子没有什么问题,再看看下面的例子:

    1.数字的排序

    demo2:

    var arr=[3,24,6,18,7,21];
        arr.sort();
        console.log(arr); //=>[18,21,24,3,6,7]

     

    看到以上的排序结果有些人就有些懵了,数组元素超过2位数排序就出了问题,上面已经说过了sort排序是按照元素的unicode码来进行排序了,先对每一项的第一位按照ascii从小到大进行排序,如果第一位相同再将第二位按照unicode从小到大进行排序。因为

       1、2、3、6、7的unicode码分别是:31、32、33、36、37,所以顺序首先是:[18,14,3,6,7,21]的第一位ascii码相同,所以再比较第二位,4的ascii码是34,所以21在24的前面,最终的排序结果是:[18,21,24,3,6,7]。虽然原因找到了,但是不是我们想要

    的排序结果,Array.sort()方法允许我们传入一个比较函数进去。如果第一个参数大于第二个参数返回1,如果第一个参数小于第二个参数就返回-1,否则返回0.

    var arr=[3,24,6,18,7,21];
        function compare(a,b){
            if(a>b){
                return 1;
            }else if(a<b){
                return -1;
            }else{
                return 0;
            }
        }
        arr.sort(compare);
        console.log(arr); //=>[3,6,7,18,21,24]

    以上代码中通过定义一个 compare方法实现了数字的正序排序,如果要降序再使用Array.reverse(),或者使用以下方法:

        // 升序
        function ascCompare(a,b){
            return a-b;
        }
        //降序
        function desCompare(a,b){
            return b-a;
        }
        console.log(arr.sort(ascCompare)); //=>[3,6,7,18,21,24]
        console.log(arr.sort(desCompare)); //=>[24,21,18,7,6,3]

    2.字母的排序:排序规则和数字的排序规则一致。

    //全部为字母
    var arr=['abc','bcb','bcd','bca'];
    console.log(arr.sort());//=>[abc,bca,bcb,bcd]
    
    //字母和数字
    var arr=[3,24,6,18,7,'abc',12,'acb','cab','53'];
    arr.sort();
    console.log(arr); //=>[12,18,24,3,53,6,7,abc,acb,cab]

     2.对象的排序

     var obj=[{name:'huawei',value:3300},{name:'apple',value:6600},{name:'honor',value:2000},{name:'mi',value:1999}];
        
        function ascCompare(a,b){
            return a.value-b.value;
        }
        //降序
        function desCompare(a,b){
            return b.value-a.value;
        }
        console.log(obj.sort(ascCompare)); //=>[{name:'apple',value:6600},{name:'huawei',value:3300},{name:'honor',value:2000},{name:'mi',value:1999}]
        console.log(obj.sort(desCompare)); //=>[{name:'mi',value:1999},{name:'honor',value:2000},{name:'huawei',value:3300},{name:'apple',value:6600}]
  • 相关阅读:
    LIS
    原根
    数三角形
    组合数问题
    最短路问题
    2020总结
    树状数组
    康托展开
    LCA
    并查集
  • 原文地址:https://www.cnblogs.com/hgdzjp/p/10496158.html
Copyright © 2020-2023  润新知