其实我们可以少写点if else和switch

 

前言

作为搬砖在第一线的底层工人,业务场景从来是没有做不到只有想不到的复杂。
不过他强任他强,if-else全搞定,搬就完了。但是随着业务迭代或者项目交接,自己在看自己或者别人的if代码的时候,心情就不再表述了,各自深有体会。所以我们一起看看if还能怎么写

最基本if-else

假设有这么个场景,不同情况下打印不同值。
因为涉及到的条件太多,就不提三目运算之类优化了。

if (a == 1) {     console.log('a1') } else if (a == 2) {     console.log('b2') } else if (a == 3) {     console.log('c3') } else if (a == 4) {     console.log('d4') } /* n..... */

现在还算能看,因为逻辑简单,如果逻辑复杂,迭代多个版本之后,你还敢动吗。
每动一下就战战兢兢,谁知道哪里会遗漏。
那么换种方式呢

switch-case

这样稍微清晰那么一点,差别好像没什么差别:

switch(a){     case 1:         console.log('a1');         break;     /* 省略。。。 */       case 40:         console.log('a40');         break; }

分离配置信息与执行动作

object映射

定义一个object作为配置对象来存放不同状态,通过链表查找

const statusMap = {     1:()=>{         console.log('a1')     },     2:()=>{         console.log('b2')     }     /* n.... */ } // 执行 let a = 1  statusMap[a || 1]()

这样比较清晰,将条件配置与具体执行分离。如果要增加其他状态,只修改配置对象即可。

数组映射

当然在某些状态下可以使用数组,来做这个配置对象。

// 这里就涉及其他优化了,例如将执行函数抽离出来,大家不要关注func的内容就好。 // 它就是个function,内容很复杂 const statusArr = [function(){     console.log(1) },     function () {         console.log(2)     },] // 执行 let a = 1 statusArr[a || 1]()

数组的要求更高一点,如果是其他key,例如字符串,那么数组就不能满足需求了

升级版:不同key相同value

这样看起来好一点了,那么需求又有变动了,
前面是每种处理方式都不同,下面有几种情况下处理函数相同的,
例如1-39的时候,调用a,40之后调用b,如果我们继续来用映射的方式来处理。

function f1 (){     console.log(1) } function f2 (){     console.log(2) } const statusMap={     1:f1,     2:f1,     3:f1,     4:f1,     //省略     40:f2 } let a = 2 statusMap[a]()

这样当然也可以,不过重复写那么多f1,代码看起来不够简洁。

开始重构之前我们先捋一下思路,无非是想把多个key合并起来,对应一个value。
也就是说我们的键值不是字符串而是个数组,object显然只支持字符串,
那么可以将这么多key合并成一个:'1,2,3,4,..,9'。

但是查找的时候有点问题了,我们的参数肯定不能完全匹配。
接着走下去,是不是做个遍历加个判断,包含在子集内的都算匹配,那么代码看起来就是下面这个样子。


                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信