Skip to content

title: if-else date: 2017-11-11 18:15:55 categories: tags:


look-up 表代替 if-else

比如大家可能会遇到类似下面的需求:比如某平台的信用分数评级,超过 700-950,就是信用极好,650-700 信用优秀,600-650 信用良好,550-600 信用中等,350-550 信用较差。

js
function showGrace(grace) {
    let graceForLevel=[700,650,600,550];
    let levelText=['信用极好','信用优秀','信用良好','信用中等','信用较差'];
    for(let i=0;i<graceForLevel.length;i++){
        if(grace>=graceForLevel[i]){
            return levelText[i];
        }
    }
    //如果不存在,那么就是分数很低,返回最后一个
    return levelText[levelText.length-1];
}

如果还想灵活一些,可以封装一个稍微通用一点的 look-up 函数。

js
function showGrace(grace,level,levelForGrace) {
    for(let i=0;i<level.length;i++){
        if(grace>=level[i]){
            return levelForGrace[i];
        }
    }
    //如果不存在,那么就是分数很低,返回最后一个
    return levelForGrace[levelForGrace.length-1];
}
let graceForLevel=[700,650,600,550];
let levelText=['信用极好','信用优秀','信用良好','信用中等','信用较差'];

配置对象代替 switch

比如有一个需求:传入 cash,check,draft,zfb,wx_pay,对应输出:现金,支票,汇票,支付宝,微信支付。

需求也很简单,就一个 switch 就搞定了

js
function getPayChanne(tag){
    switch(tag){
        case 'cash':return '现金';
        case 'check':return '支票';
        case 'draft':return '汇票';
        case 'zfb':return '支付宝';
        case 'wx_pay':return '微信支付';
    }
}

但是这个的硬伤还是和上面一样,万一下次又要多加一个如:bank_trans 对应输出银行转账呢,代码又要改。类似的问题,同样的解决方案,配置数据和业务逻辑分离。代码如下。

js
function getPayChanne(tag){
    let payChanneForChinese = {
        'cash': '现金',
        'check': '支票',
        'draft': '汇票',
        'zfb': '支付宝',
        'wx_pay': '微信支付',
    };
    return payChanneForChinese[tag];
}

同理,如果想封装一个通用的,也可以的

js
let payChanneForChinese = {
    'cash': '现金',
    'check': '支票',
    'draft': '汇票',
    'zfb': '支付宝',
    'wx_pay': '微信支付',
};
function getPayChanne(tag,chineseConfig){
    return chineseConfig[tag];
}
getPayChanne('cash',payChanneForChinese);

这里使用对象代替 switch 好处就在于

  • 使用对象不需要 switch 逐个 case 遍历判断。
  • 使用对象,编写业务逻辑可能更灵活
  • 使用对象可以使得配置数据和业务逻辑分离。

https://juejin.im/post/5b4b73e7f265da0f96287f0a?utm_source=gold_browser_extension