zoukankan      html  css  js  c++  java
  • JavaScript基本知识

    数组的排序

    JavaScript可以实现多维数组,对象数组等排序,语法如下

    arrayobj.sort(sortfunction) 
    
    参数
    arrayObj  必选项。任意 Array 对象。
    sortFunction   可选项。是用来确定元素顺序的函数的名称。如果这个参数被省略,那么元素将按照 ASCII 字符顺序进行升序排列。 
    说明
    sort 方法将 Array 对象进行适当的排序;在执行过程中并不会创建新的 Array 对象。 如果为 sortfunction 参数提供了一个函数,那么该函数必须返回下列值之一: 
    负值,如果所传递的第一个参数比第二个参数小。
    零,如果两个参数相等。 正值,如果第一个参数比第二个参数大

    不会创建新的Array对象即数组在原数组上进行排序,不生成副本。如果调用sort方法时没有使用参数,将按字母的顺序进行排序,即元素将按照 ASCII 字符顺序进行升序排列。

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

    • 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
    • 若 a 等于 b,则返回 0。
    • 若 a 大于 b,则返回一个大于 0 的值。
    //数值排序
    function SortNumByAsc(a ,b) {
        return a - b;
    }
    function SortNumByDesc(a, b) {
        return b - a;
    }
    
    var nArr = new Array(8, -6, 9, 20, -3, 5, 18, 12);
    nArr.sort(SortNumByAsc);
    console.info(nArr); //-6, -3, 5, 8, 9, 12, 18, 20 nArr.sort(SortNumByDesc); console.info(nArr); //20, 18, 12, 9, 8, 5, -3, -6

    sort(fun)接受了比较2个数值大小的函数,如果不比较数值的大小,如下

    var phone = ["Apple", "Android", "WP7"];
    phone.sort(); 
    console.info(phone); //"Android", "Apple", "WP7"

    数组直接调用sort后,数组按字母的顺序对数组中的元素进行排序,但如果是一个JSON数组如下

      var person = [];
          person[0] = { name: "Irving",age: 22, hobby: "eat" };
          person[1] = { name: "Jimmy", age: 27, hobby: "read" };
          person[2] = { name: "Rain",  age: 18, hobby: "sleep" };

    现要根据age的大小对person排序,同样需要构造个对象数组排序的函数,如下

    //单键排序
    function SortByTagName(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 person = [{ name: "Irving", age: 22, hobby: "eat" },{ name: "Jimmy", age: 27, hobby: "read" },{ name: "Rain", age: 18, hobby: "sleep" }];
         person.sort(SortByTagName("age")); //根据age排序
         console.info(person[0]);   //{ name="Rain",  age=18,  hobby="sleep"}

    这里,对象排序就基本实现了,那么可以实现像MSSQL中order by age ,name 一样排序吗,即先是对age排序,如果age相同,再比较name,必须可以,改造上述函数如下

    //多键排序 (def可选参数)
    function SortByTagName(name, def) {
        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 def === 'function' ? def(o, p) : 0;
                }
                if (typeof a === typeof b) {
                    return a < b ? -1 : 1;
                }
                return typeof a < typeof b ? -1 : 1;
            } else {
                throw ("error");
            }
        }
    }

    调用

     person.sort(SortByTagName("age", SortByTagName("name"))); //,SortByTagName("name") 可选参数

    运用上述方法就可以随便排序了,这里介绍个JQ插件 Jquery.tinysort ,

    举个列子

    <ul class="xmpl" id="xnum">
       <li>unrennef</li>
       <li>eisuqjios</li>
       <li>241</li>
       <li>20.6</li>
       <li>851</li>
       <li>65.3</li>
    </ul>

    只需调用 即可实现对li中的数值排序

    $('ul#xnum>li').tsort();

    结果

    <ul id="xnum" class="xmpl">
        <li>20.6</li>
        <li>65.3</li>
        <li>241</li>
        <li>851</li>
        <li>eisuqjios</li>
        <li>unrennef</li>
    </ul>

    API:http://tinysort.sjeiti.com/

    修订记录

    2012年6月21日18:48:23 开篇   数组的排序

  • 相关阅读:
    【洛谷P2660烤鸡】
    cogs448
    排队打水
    洛谷U36590搬书
    NOIP2012借教室
    归并排序模版
    NOIP2015神奇的幻方
    NOIP2006能量项链
    NOIP2003加分二叉树
    NOI1995石子合并&多种石子合并
  • 原文地址:https://www.cnblogs.com/Irving/p/2558648.html
Copyright © 2011-2022 走看看