() js用sort()排序,用的比较函数出现两个参数情况下怎么排序?

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 = functionname{ return functiono, 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.sortby"age";

3.第二种情况下是根据多个键值进行比较。如果第一个参数“age”相同,则比较第二个参数“name”。

var by = functionname,minor{ return functiono,p{ var a,b; ifo && p && typeof o === object && typeof p ===object{ a = o[name]; b = p[name]; ifa === b{ return typeof minor === function ? minoro,p:0; } iftypeof a === typeof b{ return a < b ? -1:1; } return typeof a < typeof b ? -1 : 1; }else{ thro"error"; } }
} employees.sortbyage,byname;

**問題來了:
①上面的參數是在by裏面調用了by方法,但是裏面的by方法卻只傳了一個參數name,可以调用嗎?
②在比較函數中,判断a===b时利用typeof判断minor参数是不是函数,如果是则执行minor,也就是调用byname,但是参数不对应,而且minoro,p是哪里定义的?具体是怎么执行的?**

①上面的參數是在by裏面調用了by方法,但是裏面的by方法卻只傳了一個參數name,可以调用嗎?

javascript里函数参数是不固定的,如果函数声明中的形参被没有对应的实参,则这个形参的值就是“undefined”。

举个栗子:

function testa, b { console.loga; console.logb;
} test1;
/* * Result: * 1 * undefined */

So,只传一个参数“name”是可以的,且在后面的判断里面会得到处理:

return typeof minor === function ? minoro,p:0; //此时的minor参数没传入的话,其值是“undefined”,所以该行代码会返回0,否则会执行minoro, p

②在比較函數中,判断a===b时利用typeof判断minor参数是不是函数,如果是则执行minor,也就是调用byname,但是参数不对应,而且minoro,p是哪里定义的?具体是怎么执行的?**

这了要理解的是:

// by函数定义是一个包含两个参数的函数,上面解释过minor参数不带也是可以的
var by = functionname,minor{……

需要特别注意的是,这个函数的又返回了一个函数:

return functiono,p{……}

那么接下来要看关键的这句了:

employees.sortbyage,byname;

这里传入的比较函数是: byage,byname

函数入参的时候的实际调用过程为:

// Array.prototype.sort[compareFunction], compareFunction是可选参数
employees.sortbyage,byname; ->
employees.sortcompareFunction=byage,byname; ->
// 下面这个赋值语句使得compareFunction变成return functiono, p {……}
compareFunction=byage,byname; ->
// 同理,进一步看by函数的入参过程
byage,byname ->
// 当第二参数byname执行完之后,minor实际也是return functiono, p {……}
byname=age, minor=byname ->
// 假设第二个实参入参的时候返回一个匿名函数lambda, 则
byage, lambda;
……

到此应该两个问题都应该明白了吧,如果有不清楚的地方,欢迎继续追问…

发表评论

电子邮件地址不会被公开。 必填项已用*标注