表驱动法(解决复杂的if判断)

描述: 取值是0~6,含义分别是周一到周日,编写函数进行转换。

function dayToWeek(day) {
    let res = ''
    if (day === 0) {
        res = '周一'
    } else if (day === 1) {
        res = '周二'
    } else if (day === 2) {
        res = '周三'
    } else if (day === 3) {
        res = '周四'
    } else if (day === 4) {
        res = '周五'
    } else if (day === 5) {
        res = '周六'
    } else if (day === 6) {
        res = '周日'
    }
return res }

上述代码很啰嗦。先用switch改写一下

function dayToWeek(day) {
    switch(day) {
        case 0: return '周一'
        case 1: return '周二'
        case 2: return '周三'
        case 3: return '周四'
        case 4: return '周五'
        case 5: return '周六'
        case 6: return '周日'
    }
}

emmm.....好一点了。有没有更好的写法?--------->表驱动法正式上线

function dayToWeek(day) {
     const weekArr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
     return weekArr[day]
}

能否再进一步优化呢?

const dayToWeek = day => '周' + ('一二三四五六日'[day] || throwError('错误的传参'))

使用场景拓展1(非线性数据): 数组---->对象

  • 例如:前端调用接口,如果报错,需要根据字段值 给用户以提示。如果使用if switch等判断, 代码略冗余。而表驱动法则就像下面这样简洁, 传入字段值则得到提示信息
const codeObj = {
    code_1001: 'XXX数据范围不对',
    code_1002: 'XXX必须是整数',
    code_1003: '请输入一个不重复的XXX',
    code_1004: 'XXX和YYY不匹配, 请重新输入',
    code_1005: 'XXX...'
}
function codeToInfo(val){
    return codeObj[val]
}

使用场景拓展2(阶梯访问表:范围判断) 

  •  例如:学生成绩, 低于59分为'F', 低于79为'E', 低于84分为'D', 以此类推。  依赖于键值对, 但键、值要放在不同数组中
const grade = [59, 79, 84, 89, 94, 100] 
const level = ['F', 'E', 'D', 'C', 'B', 'A']
function getLevel(val){ // 使用for in相比于forEach等遍历方式,好处是可提前跳出循环
    for(let i in grade) {
        if(val < grade[i]) {
            return level[i]
        }
    }
}

 

posted @ 2020-04-18 12:40  进心进利  阅读(648)  评论(0编辑  收藏  举报