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 开篇   数组的排序

原文地址:https://www.cnblogs.com/Irving/p/2558648.html