函数排序javascript,将一个函数作为另一个函数的返回值。

本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~

    假设我们用一个数组保存一组先生的基本信息。

var studentsData = 
    [{name:"mike",age:17},
     {name:"loren",age:16},
     {name:"frank",age:18}];
当初,我们需要对这个数组按照姓名(name)字段进行升序排序,在这个场景内,应用数组的sort(compareFunction)方法进行排序,该方法的参数是一个比拟函数。

    比拟函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个正数,如果两个参数相等则返回0,如果第一个参数应该位于第二个以后则返回一个正数。

    以下为按照name字段进行排序:

function compareFunctionByName(object1,object2){
    var value1=object1["name"];
    var value2=object2["name"];
    if(value1<value2){
        return -1;
    }else if(value1==value2){
        return 0;
    }else{
        return 1;
    }    
};


studentsData.sort(compareFunctionByName);
结果:

    frank
loren
mike

 

    这样的排序写法简单有效,但是,如果此时需求变革,除了name外还需要对先生的age进行排序时,一般的做法是另外写一个按照age字段进行排序的比拟函数,然后在调用的地方作个条件判断,决议应用哪个版本的比拟函数。

    新增加版本的比拟函数如下:

    每日一道理
人生是洁白的画纸,我们每个人就是手握各色笔的画师;人生也是一条看不到尽头的长路,我们每个人则是人生道路的远足者;人生还像是一块神奇的土地,我们每个人则是手握农具的耕耘者;但人生更像一本难懂的书,我们每个人则是孜孜不倦的读书郎。
function compareFunctionByAge(object1,object2){
    var value1=object1["age"];
    var value2=object2["age"];
    if(value1<value2){
        return -1;
    }else if(value1==value2){
        return 0;
    }else{
        return 1;
    }    
};
下面的写法工作的很好,但是两个版本的比拟函数除了比拟字段的不同外,其余部分均相同,如果又增加了对其他字段进行排序需求的话,代码的冗余度大大增加,而且代码会愈来愈丑陋。

 

    当这类场景产生时,我们就需要用到js函数中一个非常有用的特性:将一个函数作为另一个函数的返回值。

    具体作法,写一个生成函数,该生成函数根据字段名生成相应版本的比拟函数,并将比拟函数返回作为sort方法的参数。

    如下:

function createCompareFunction(fieldName){
    return function(object1,object2){
        var value1=object1[fieldName];
        var value2=object2[fieldName];
        if(value1<value2){
            return -1;
        }else if(value1==value2){
            return 0;
        }else{
            return 1;
        }    
    };
}

//按照name字段进行排序
studentsData.sort(createCompareFunction("name"));

//按照age字段进行排序
studentsData.sort(createCompareFunction("age"));
如此便处理了高冗余度的问题,并且通用性精良。

 

    javascript函数的这一特性在实际中应用点很多,继续挖掘中。。。

    ^_^。

文章结束给大家分享下程序员的一些笑话语录: 现在社会太数字化了,所以最好是有一个集很多功能于一身的设备!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值