我们知道,javascript的数组有sort这个API来进行排序。sort可以接收一个参数并且这个参数只能是函数。
sort这个API是有缺陷的,所以我们经常会这样来改进它:
var a = [1,23,5,12,213,54353,123,231,32,22];
function sortNum(a,b){
return a-b;
}
alert(a.sort(sortNum));
这样可以保证数组能按照数字从小到大排序。那么如何对一个对象数组进行排序呢?
var person = [{name:"alex",age:25},{name:"bob",age:23},{name:"tom",age:23},{name:"ada",age:23},{name:"dave",age:28}];
function sortNum(){
console.info(arguments);
var age1 = arguments[0].age;//利用argument可以测试sort中接收的参数,经过测试发现只能接收两个
var age2 = arguments[1].age;
return age1<age2?-1:1;
}
console.info(person.sort(sortNum));
这样的话可以按属性来对对象数组进行排序。那么我们继续思考一下,我们的代码要尽可能复用,那么,我们就不能在函数里面写死具体是根据哪个属性来排序,而是要自己去定义。但是我们经过测试知道,sort接收的函数只能接收两个参数,所以用这种方法不能解决。
函数有一个特性,就是一个函数可以作为另一个函数的结果来返回,ok,这就有办法了,我们可以这样来做:
var person = [{name:"alex",age:25},{name:"bob",age:23},{name:"tom",age:23},{name:"ada",age:23},{name:"dave",age:28}];
function sortObject(property1,property2){
return function sortByProperty(object1,object2){
var firstProp1 = object1[property1];
var firstProp2 = object2[property1];
if(firstProp1 === firstProp2){
var secondProp1 = object1[property2];
var secondProp2 = object2[property2];
return secondProp1<secondProp2?-1:1;
}else{
return firstProp1<firstProp2?-1:1;
}
}
}
console.info(person.sort(sortObject("age","name")));