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

查看:180
本文介绍了javascript - 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 = 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。

举个栗子:

function test(a, b) {
  console.log(a);
  console.log(b);
}

test(1);
/* 
 * Result:
 * 1
 * undefined
 */

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

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

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

这了要理解的是:

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

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

return function(o,p){……}

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

employees.sort(by('age',by('name')));

这里传入的比较函数是: by('age',by('name'))

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

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

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

这篇关于javascript - js用sort()排序,用的比较函数出现两个参数情况下怎么排序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆