Array.prototype.sort方法是对数组进行排序, 该方法带一个函数参数,用来指定排序的规则.

    js默认的sort函数,是把所有要排序的元素视为“字符串”,之后进行排序;

1比较简单的一维数组:

        var arr=[2,1,3,4];   alert(arr.sort())  // [1,2,3,4] 从小到大排列

2. 对多维数组的排序:

var arr=[             [2,1,55,4],             [5,3,22,3],             [1,2,77,2],             [9,4,33,5],          ];                 alert("默认按第一列排\n"+arr.sort().join("\n"))  alert("现在按第三列排\n"+arr.sort(function(left,right){return left[2]>right[2]?1:-1}).join("\n"))  alert("现在按第三列倒排\n"+arr.sort(function(left,right){return left[2]>right[2]?-1:1}).join("\n"))

3.对复杂数据结构的排序

Array.prototype.each=function(f){for(var i=0;i
right.money?-1:1}).each(showName) ;

    上面说到,默认的sort函数,是把所有要排序的元素视为“字符串”,之后进行排序;因此,不能智能到在比较这些元素之前先检测他们类型,所以经常会得到一个比较离谱的结果;

    不过幸运的是,我们可以自定义比较函数来替换js默认的比较函数;这个自定义的函数应该接受两个参数(a,b),并且如果两个参数相等返回"0",如果a在b前面,返回负数;反之返回正数;

    n = [4,8,15,16,25,42];n.sort(function(a,b) {return a-b;});

上面函数可以使数字数组,正确排序;单不能是字符串排序;如果我们想要给任意包含简单数值(数字,字符串)数组排序呢:

    下面给出来一个比较实用的方法:

var m = ["aa","bb","a",4,8,16,19,23,42];m.sort(function(a,b) {if (a === b){return 0;}if (typeof a === typeof b) {return a < b ? -1:1;}return typeof a < typeof b ? -1 : 1;});

由此,引申,我们也可以对对象数组进行排序;当然排序时,比较的内容可以使所有对象的相同的属性;

下面编写了一个对一组对象的某一相同属性进行排序的算法:

   

 var sortObj = [{firstName : "Joe",lastName : "Howard"},{firstName : "Tom",lastName : "Fine"},{firstName : "Blue",lastName : "Besser"},{firstName : "Jhon",lastName : "Howard"},{firstName : "Jhon",lastName : "Obam"},{firstName : "Farmer",lastName : "DeRita"}];    var sortBy = 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 {name: 'Error', message: 'Expected an object when sorting by ' + name }; } };    }

由于sort方法是不稳定的,所以这样调用:

sortObj.sort(sortBy("firstName")).sort(sortBy("lastName"));

不能保证产生你想要的结果;但是,如果你想要基于多个键值进行排序,你需要优化上面的算法,

让其接受两个参数,当主要的键值产生一个匹配的时间,另一个compare方法将调用一决高下:

当o[name] 和 p[name]相等时,次要的比较函数被用来一决高下,具体算法如下:

    

var sortBy = function(name,minor)    { 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 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 {     throw {name: 'Error', message: 'Expected an object when sorting by ' + name }; } };    }

数组的sort还是比较强大和好用的,以上均属个人言论,欢迎指教,好了,自己胡言乱语到此结束;

谢谢。