表驱动法(解决复杂的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] } } }