zoukankan      html  css  js  c++  java
  • JavaScript:sort() 方法

    ylbtech-JavaScript:sort() 方法

     JavaScript sort() 方法

    1. 定义和用法返回顶部
    sort() 方法用于对数组的元素进行排序。
    语法
    arrayObject.sort(sortby)
    参数 描述  
    sortby 可选。规定排序顺序。必须是函数。  

    返回值

    对数组的引用。请注意,数组在原数组上进行排序,不生成副本。

    说明

    如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。

    如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:

    • 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
    • 若 a 等于 b,则返回 0。
    • 若 a 大于 b,则返回一个大于 0 的值。
    2. 实例 1返回顶部
    例子 1
    在本例中,我们将创建一个数组,并按字母顺序进行排序:
    <script type="text/javascript">
    
    var arr = new Array(6)
    arr[0] = "George"
    arr[1] = "John"
    arr[2] = "Thomas"
    arr[3] = "James"
    arr[4] = "Adrew"
    arr[5] = "Martin"
    
    document.write(arr + "<br />")
    document.write(arr.sort())
    
    </script>

    输出:

    George,John,Thomas,James,Adrew,Martin
    Adrew,George,James,John,Martin,Thomas

    例子 2

    在本例中,我们将创建一个数组,并按字母顺序进行排序:

    <script type="text/javascript">
    
        var arr = new Array(6)
        arr[0] = "10"
        arr[1] = "5"
        arr[2] = "40"
        arr[3] = "25"
        arr[4] = "1000"
        arr[5] = "1"
    
        document.write(arr + "<br />")
        document.write(arr.sort())
    
    </script>

    输出:

    10,5,40,25,1000,1
    1,10,1000,25,40,5

    请注意,上面的代码没有按照数值的大小对数字进行排序,要实现这一点,就必须使用一个排序函数:

    <script type="text/javascript">
    
    function sortNumber(a,b)
    {
    return a - b
    }
    
    var arr = new Array(6)
    arr[0] = "10"
    arr[1] = "5"
    arr[2] = "40"
    arr[3] = "25"
    arr[4] = "1000"
    arr[5] = "1"
    
    document.write(arr + "<br />")
    document.write(arr.sort(sortNumber))
    
    </script>

    输出:

    10,5,40,25,1000,1
    1,5,10,25,40,1000
    3. 实例 2返回顶部
    例子 1
    在本例中,我们将创建一个数组,并按字母顺序进行排序:
    <script type="text/javascript">
    
        // by函数接受一个成员名字符串做为参数
        // 并返回一个可以用来对包含该成员的对象数组进行排序的比较函数
        var by = function (name) {
            return function (o, p) {
                var a, b;
                if (typeof o === "object" && typeof p === "object" && o && p) {
                    a = o[name];
                    b = p[name];
                    if (a === b) {
                        return 0;
                    }
                    if (typeof a === typeof b) {
                        return a < b ? -1 : 1;
                    }
                    return typeof a < typeof b ? -1 : 1;
                }
                else {
                    throw ("error");
                }
            }
        }
    
        // 数组
        var employees = []
        employees[0] = { name: "George", age: 32, retiredate: "March 12, 2014" }
        employees[1] = { name: "Edward", age: 17, retiredate: "June 2, 2023" }
        employees[2] = { name: "Christine", age: 58, retiredate: "December 20, 2036" }
        employees[3] = { name: "Sarah", age: 62, retiredate: "April 30, 2020" }
    
        // 排序
        employees.sort(by("age"));
    
        // 输出
        for (var i = 0; i < employees.length; i++)
        {
            document.writeln(employees[i].name + "," + employees[i].age + "," + employees[i].retiredate + "<br>");
        }
    </script>

     输出:

    Edward,17,June 2, 2023
    George,32,March 12, 2014
    Christine,58,December 20, 2036
    Sarah,62,April 30, 2020

     例子 2

    到这里,对象数组排序就算基本实现了。那如何实现多个键值排序呢?意思就是先是对age排序,如果age相同,再比较name。

    这时,我们可以进一步修改by函数,让其可以接受第二个参数,当主要的键值产生一个匹配的时候,另一个compare方法将被调用以决出高下。

    <script type="text/javascript">
    
        //by函数接受一个成员名字符串和一个可选的次要比较函数做为参数
        //并返回一个可以用来包含该成员的对象数组进行排序的比较函数
        //当o[age] 和 p[age] 相等时,次要比较函数被用来决出高下
        var by = function (name, minor) {
            return function (o, p) {
                var a, b;
                if (o && p && typeof o === 'object' && typeof p === 'object') {
                    a = o[name];
                    b = p[name];
                    if (a === b) {
                        return typeof minor === 'function' ? minor(o, p) : 0;
                    }
                    if (typeof a === typeof b) {
                        return a < b ? -1 : 1;
                    }
                    return typeof a < typeof b ? -1 : 1;
                } else {
                    thro("error");
                }
            }
        }
    
        // 数组
        var employees = []
        employees[0] = { name: "George", age: 32, retiredate: "March 12, 2014" }
        employees[1] = { name: "Edward", age: 17, retiredate: "June 2, 2023" }
        employees[2] = { name: "Christine", age: 58, retiredate: "December 20, 2036" }
        employees[3] = { name: "Sarah", age: 62, retiredate: "April 30, 2020" }
    
        // 排序
        employees.sort(by('age', by('name')));
    
        // 输出
        for (var i = 0; i < employees.length; i++)
        {
            document.writeln(employees[i].name + "," + employees[i].age + "," + employees[i].retiredate + "<br>");
        }
    </script>

     输出:

    Edward,17,June 2, 2023
    George,32,March 12, 2014
    Christine,58,December 20, 2036
    Sarah,62,April 30, 2020
    4.返回顶部
     
    5.返回顶部
     
     
    6.返回顶部
     
    7.返回顶部
     
    8.返回顶部
     
    9.返回顶部
     
    10.返回顶部
     
    11.返回顶部
     
    warn 作者:ylbtech
    出处:http://ylbtech.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    树莓派上使用docker部署aria2,minidlna
    在Ubuntu上部署一个基于webrtc的多人视频聊天服务
    解决.net core3.1使用docker部署在Ubuntu上连接sqlserver报error:35的问题
    .Net Core in Docker
    .Net Core in Docker
    SQL Server in Docker
    使用Docker运行SQL Server
    Spring Boot 2.x(四):整合Mybatis的四种方式
    Spring Boot 2.x (一):HelloWorld
    yarn (npm) 切换设置镜像源
  • 原文地址:https://www.cnblogs.com/ylbtech/p/8087747.html
Copyright © 2011-2022 走看看