1.首先是要排序的数组
var employees=[]
employees[0]={name:"George", age:32, retiredate:"March 12, 2014"}
employees[1]={name:"Edward", age:17, retiredate:"June 2, 2023"}
employees[2]={name:"Christine", age:58, retiredate:"December 20, 2036"}
employees[3]={name:"Sarah", age:62, retiredate:"April 30, 2020"}
2.第一种情况下是比较函数根据一个参数进行比较,然后排序;
var by = 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 ("error");
}
}
}
employees.sort(by("age"));
3.第二种情况下是根据多个键值进行比较。如果第一个参数“age”相同,则比较第二个参数“name”。
var by = function(name,minor){
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 minor === 'function' ? minor(o,p):0;
}
if(typeof a === typeof b){
return a < b ? -1:1;
}
return typeof a < typeof b ? -1 : 1;
}else{
thro("error");
}
}
}
employees.sort(by('age',by('name')));
**問題來了:
①上面的參數是在by()裏面調用了by()方法,但是裏面的by()方法卻只傳了一個參數'name',可以调用嗎?
②在比較函數中,判断a===b时利用typeof判断minor参数是不是函数,如果是则执行minor(),也就是调用by('name'),但是参数不对应,而且minor(o,p)是哪里定义的?具体是怎么执行的?**
①上面的參數是在by()裏面調用了by()方法,但是裏面的by()方法卻只傳了一個參數'name',可以调用嗎?
javascript里函数参数是不固定的,如果函数声明中的形参被没有对应的实参,则这个形参的值就是“undefined”。
举个栗子:
So,只传一个参数“name”是可以的,且在后面的判断里面会得到处理:
②在比較函數中,判断a===b时利用typeof判断minor参数是不是函数,如果是则执行minor(),也就是调用by('name'),但是参数不对应,而且minor(o,p)是哪里定义的?具体是怎么执行的?**
这了要理解的是:
需要特别注意的是,这个函数的又返回了一个函数:
那么接下来要看关键的这句了:
这里传入的比较函数是: by('age',by('name'))
函数入参的时候的实际调用过程为:
到此应该两个问题都应该明白了吧,如果有不清楚的地方,欢迎继续追问…