js中减少if-else的几个小技巧
admin
2024-02-18 21:01:37

1.使用三目运算符,这个很多朋友都用过的;

例子:条件为 true 时返回1,反之返回0:const fn = (nBoolean) {if (nBoolean) {return 1} else {return 0}}

使用三目运算符:

const fn = (nBoolean) {return nBoolean ? 1 : 0
}

2.switch case

let type = 'A'//if else if
if (type === 'A' || type === 'B') {console.log(1);
} else if (type === 'C') {console.log(2);
} else if(type === 'D') {console.log(3);
} else {console.log(0)
}//switch case
switch (type) {case 'A':case 'B':console.log(1)breakcase 'C':console.log(2)breakcase 'D':console.log(3);break;default:console.log(0)
}

我平时用switch相对少一些,感觉写起来有点麻烦。

3.对象配置/策略模式

对象配置看起来跟 策略模式 差不多,都是根据不同得参数使用不同得数据/算法/函数。

策略模式就是将一系列算法封装起来,并使它们相互之间可以替换。被封装起来的算法具有独立性,外部不可改变其特性。

接下来我们用对象配置的方法实现一下上述的例子let type = 'A'let tactics = {'A': 1,'B': 1,'C': 2,'D': 3,default: 0
}
console.log(tactics[type]) // 1

案例1 商场促销价
根据不同的用户使用不同的折扣,如:普通用户不打折,普通会员用户9折,年费会员8.5折,超级会员8折。

if-else大家肯定知道,那么使用对象配置呢?

// 获取折扣 -- 使用对象配置/策略模式
const getDiscount = (userKey) => {// 我们可以根据用户类型来生成我们的折扣对象let discounts = {'普通会员': 0.9,'年费会员': 0.85,'超级会员': 0.8,'default': 1}return discounts[userKey] || discounts['default']
}
console.log(getDiscount('普通会员')) // 0.9

从上面按理可看出,使用对象配置比if-lese可读性要搞,后续若需要添加用户折扣只需要修改折扣对象就行。

对象配置不一定非要使用对象去管理我们键值对,还可以使用 Map去管理。

// 获取折扣 -- 使用对象配置/策略模式
const getDiscount = (userKey) => {// 我们可以根据用户类型来生成我们的折扣对象let discounts = new Map([['普通会员', 0.9],['年费会员', 0.85],['超级会员', 0.8],['default', 1]])return discounts.get(userKey) || discounts.get('default')
}
console.log(getDiscount('普通会员')) // 0.9

案例2 年终奖
公司的年终奖根据员工的工资基数和绩效等级来发放的。例如,绩效为A的人年终奖有4倍工资,绩效为B的有3倍,绩效为C的只有2倍。

假如财务部要求我们提供一段代码来实现这个核算逻辑,我们要怎么实现呢?

if-else就不写了。

let strategies =new Map([
['A',4],
['B',3],
['C',2]
])
const caluteBonus = (performance,salary)=>{
return strategies.get(performance)*salary
}
calculateBonus( 'B', 20000 ) // 输出:60000

至此,这个需求做完了,然后产品经理说要加上一个部门区分,假设公司有两个部门D和F,D部门的业绩较好,所以年终奖翻1.2倍,F部门的业绩较差,年终奖打9折。

// 以绩效_部门的方式拼接键值存入
let strategies = new Map([['A_D', 4 * 1.2],['B_D', 3 * 1.2],['C_D', 2 * 1.2],['A_F', 4 * 0.9],['B_F', 3 * 0.9],['C_F', 2 * 0.9]
])
const calculateBonus = (performanceLevel, salary, department) => { return strategies.get(`${performanceLevel}_${department}`) * salary
}
calculateBonus( 'B', 20000, 'D' ) // 输出:72000

相关内容

热门资讯

山水皆有情!丽江两山一江的千年... 去过丽江、走过虎跳峡的人,大概率都听过哈巴雪山和金沙江的传说。很多人站在峡谷之下,望着奔腾不息的金沙...
活力中国调研行丨“殷”你而来 ... 9月12日,游客在殷墟博物馆“甲骨文展厅”内参观。位于河南省安阳市的殷墟博物馆新馆是首个全景式展现商...
浦江之夜赴美好相逢,第37届上... 9月12日晚,黄浦江畔灯火璀璨,第37届上海旅游节大巡游在外滩中山东一路上演。不少观众早早便来到外滩...
美丽中国丨秋韵紫鹊界 梯田入画... 这是9月11日拍摄的紫鹊界梯田(无人机照片)。 金秋九月,湖南省娄底市新化县紫鹊界梯田稻谷渐次成熟。...
中国之巅奏响《共同的节日》,千... 千吨阻尼器,“迎世赛、游上海旅游节”。9月13日,由上海市文化和旅游局指导推出上海旅游·会客│巅峰之...