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;iright.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还是比较强大和好用的,以上均属个人言论,欢迎指教,好了,自己胡言乱语到此结束;
谢谢。