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

相关内容

热门资讯

地方新闻精选 | 杭州宣布灵隐... 【浙江】杭州宣布灵隐寺12月1日起免门票,需至少提前一天预约11月19日,中国蓝新闻记者从浙江省杭州...
从山海古城到青春乐场,日照的滨... 中新网日照11月19日电(记者 左宇坤)深秋时节,山东日照莒县浮来山上的“天下银杏第一树”迎来一年中...
重构温泉体验:项目实践与发展路... 传统温泉同质化、体验形式单一的问题日益凸显,难以满足当下游客对个性化、沉浸式、多功能消费的需求。随着...
原创 非... 面对急需帮助的人,我们会先选择帮助,还是先拍照呢?如果这是发生在10年前,肯定不用多想,大家一定会第...