JavaScript 复杂判断的更优雅写法借鉴
前言:
我们编写js代码时经常遇到复杂逻辑判断的情况,通常大家可以用if/else或者switch来实现多个条件判断,但这样会有个问题,随着逻辑复杂度的增加,代码中的if/else/switch会变得越来越臃肿,越来越看不懂,我借鉴了下美文如下:
举个栗子:
- const onButtonClick = (status)=>{
- if(status == 1){
- sendLog('processing')
- jumpTo('IndexPage')
- }else if(status == 2){
- sendLog('fail')
- jumpTo('FailPage')
- }else if(status == 3){
- sendLog('fail')
- jumpTo('FailPage')
- }else if(status == 4){
- sendLog('success')
- jumpTo('SuccessPage')
- }else if(status == 5){
- sendLog('cancel')
- jumpTo('CancelPage')
- }else {
- sendLog('other')
- jumpTo('Index')
- }
- }
通过代码可以看到这个按钮的点击逻辑:根据不同活动状态做两件事情,发送日志埋点和跳转到对应页面,大家可以很轻易的提出这段代码的改写方案,switch出场:
- /**
- * 按钮点击事件
- * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 商品售罄 4 开团成功 5 系统取消
- */
- const onButtonClick = (status)=>{
- switch (status){
- case 1:
- sendLog('processing')
- jumpTo('IndexPage')
- break
- case 2:
- case 3:
- sendLog('fail')
- jumpTo('FailPage')
- break
- case 4:
- sendLog('success')
- jumpTo('SuccessPage')
- break
- case 5:
- sendLog('cancel')
- jumpTo('CancelPage')
- break
- default:
- sendLog('other')
- jumpTo('Index')
- break
- }
- }
嗯,这样看起来比if/else清晰多了,细心的同学也发现了小技巧,case 2和case 3逻辑一样的时候,可以省去执行语句和break,则case 2的情况自动执行case 3的逻辑。
还有更简单的写法:
- const actions = {
- '1': ['processing','IndexPage'],
- '2': ['fail','FailPage'],
- '3': ['fail','FailPage'],
- '4': ['success','SuccessPage'],
- '5': ['cancel','CancelPage'],
- 'default': ['other','Index'],
- }
- /**
- * 按钮点击事件
- * @param {number} status 活动状态:1开团进行中 2开团失败 3 商品售罄 4 开团成功 5 系统取消
- */
- const onButtonClick = (status)=>{
- let action = actions[status] || actions['default'],
- logName = action[0],
- pageName = action[1]
- sendLog(logName)
- jumpTo(pageName)
- }
这种方法的聪明之处在于:将判断条件作为对象的属性名,将处理逻辑作为对象的属性值,在按钮点击的时候,通过对象属性查找的方式来进行逻辑判断,这种写法特别适合一元条件判断的情况。
- const actions = new Map([
- [1, ['processing','IndexPage']],
- [2, ['fail','FailPage']],
- [3, ['fail','FailPage']],
- [4, ['success','SuccessPage']],
- [5, ['cancel','CancelPage']],
- ['default', ['other','Index']]
- ])
- /**
- * 按钮点击事件
- * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 商品售罄 4 开团成功 5 系统取消
- */
- const onButtonClick = (status)=>{
- let action = actions.get(status) || actions.get('default')
- sendLog(action[0])
- jumpTo(action[1])
- }
我们需要把问题升级一下,以前按钮点击时候只需要判断status,现在还需要判断用户的身份:
- /**
- * 按钮点击事件
- * @param {number} status 活动状态:1开团进行中 2开团失败 3 开团成功 4 商品售罄 5 有库存未开团
- * @param {string} identity 身份标识:guest客态 master主态
- */
- const onButtonClick = (status,identity)=>{
- if(identity == 'guest'){
- if(status == 1){
- //do sth
- }else if(status == 2){
- //do sth
- }else if(status == 3){
- //do sth
- }else if(status == 4){
- //do sth
- }else if(status == 5){
- //do sth
- }else {
- //do sth
- }
- }else if(identity == 'master') {
- if(status == 1){
- //do sth
- }else if(status == 2){
- //do sth
- }else if(status == 3){
- //do sth
- }else if(status == 4){
- //do sth
- }else if(status == 5){
- //do sth
- }else {
- //do sth
- }
- }
- }
二元判断时
- const actions = new Map([
- ['guest_1', ()=>{/*do sth*/}],
- ['guest_2', ()=>{/*do sth*/}],
- ['guest_3', ()=>{/*do sth*/}],
- ['guest_4', ()=>{/*do sth*/}],
- ['guest_5', ()=>{/*do sth*/}],
- ['master_1', ()=>{/*do sth*/}],
- ['master_2', ()=>{/*do sth*/}],
- ['master_3', ()=>{/*do sth*/}],
- ['master_4', ()=>{/*do sth*/}],
- ['master_5', ()=>{/*do sth*/}],
- ['default', ()=>{/*do sth*/}],
- ])
- /**
- * 按钮点击事件
- * @param {string} identity 身份标识:guest客态 master主态
- * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 开团成功 4 商品售罄 5 有库存未开团
- */
- const onButtonClick = (identity,status)=>{
- let action = actions.get(`${identity}_${status}`) || actions.get('default')
- action.call(this)
- }
用Object对象来实现
- const actions = {
- 'guest_1':()=>{/*do sth*/},
- 'guest_2':()=>{/*do sth*/},
- //....
- }
- const onButtonClick = (identity,status)=>{
- let action = actions[`${identity}_${status}`] || actions['default']
- action.call(this)
- }
用Map对象,以Object对象作为key:
- const actions = new Map([
- [{identity:'guest',status:1},()=>{/*do sth*/}],
- [{identity:'guest',status:2},()=>{/*do sth*/}],
- //...
- ])
- const onButtonClick = (identity,status)=>{
- let action = [...actions].filter(([key,value])=>(key.identity == identity && key.status == status))
- action.forEach(([key,value])=>value.call(this))
- }
JavaScript 复杂判断的更优雅写法借鉴的更多相关文章
- JavaScript复杂判断的更优雅写法
摘要: 写代码是一门艺术. 原文:JavaScript 复杂判断的更优雅写法 作者:Think. 公众号:大转转fe Fundebug经授权转载,版权归原作者所有. 前提 我们编写js代码时经常遇到复 ...
- JavaScript 复杂判断的更优雅写法
我们编写js代码时经常遇到复杂逻辑判断的情况,通常大家可以用if/else或者switch来实现多个条件判断,但这样会有个问题,随着逻辑复杂度的增加,代码中的if/else/switch会变得越来越臃 ...
- 【转】转自微信公众号 JavaScript 复杂判断的更优雅写法
与微信公众号看到一篇js复杂判断的文章,对我启发很大,故转到博客园以供后期不断学习并应用于项目.原文地址:https://mp.weixin.qq.com/s/ClFDRj4MnAxv1dJ5VWKS ...
- JavaScript 复杂判断的优雅写法
JavaScript 复杂判断的优雅写法 <div> <input type="button" name="btn" value=" ...
- C#中一种替换switch语句更优雅的写法
今天在项目中遇到了使用switch语句判断条件,但问题是条件比较多,大概有几十个条件,满屏幕的case判断,是否有更优雅的写法替代switch语句呢? 假设有这样的一个场景:商场经常会根据情况采取不同 ...
- 使用 Promises 编写更优雅的 JavaScript 代码
你可能已经无意中听说过 Promises,很多人都在讨论它,使用它,但你不知道为什么它们如此特别.难道你不能使用回调么?有什么了特别的?在本文中,我们一起来看看 Promises 是什么以及如何使用它 ...
- es6之更优雅的条件语句
在使用JavaScript时,条件判断是经常会用到的,一些简单的判断条件还可以接受,当遇到比较复杂多重条件时就比较恶心了.这里使用es6的小技巧使判断更优雅. 1.使用 Arrary.includes ...
- jquery.form.js 让表单提交更优雅
jquery.form.js 让表单提交更优雅.可以页面不刷新提交表单,比jQuery的ajax提交要功能强大. 1.引入 <script src="/src/jquery-1.9.1 ...
- JavaScript中判断变量类型最简洁的实现方法以及自动类型转换(#################################)
这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了type ...
随机推荐
- ajax传递json参数
var pros = []; for(var i = 1; i <= 2; i++) { var obj = {}; obj.id = i; obj.age = i*20; pros = pro ...
- python中的包和文件夹的区别
python的模块,就不得不说包(package),package是module的集合,在一个package中有很多的module, 还是以之前的index.py与baiduHq.py模块为案例,说明 ...
- VS2012发布Web应用程序
一.右键项目-->发布 二.配置文件:新建-->配置文件名称,如MyProject 三.连接:1.发布方法:文件系统 2.目标位置:自己在本地建立一个文件夹 3.目标URL:可以不填 四 ...
- Http中Content-Type的取值讲解
一.Content-Type的取值 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息(MediaType,即是Internet Media Type,互联网媒体类型: ...
- JAVA总结--分布式锁
1.概念 分布式锁出现的原因:单体应用单机部署环境下,为了解决多线程并发问题,我们会使用ReentrantLcok或synchronized来解决互斥问题:但业务的需求,单机部署演变成分布式系统后,在 ...
- JDK8 parallelStream性能测试
https://blog.csdn.net/u011870280/article/details/80700993 public static void main(String[] args) {lo ...
- 分支结构 :if - else
分支结构 :if - else 格式一: if(条件表达式){ 执行语句; } 格式二:二选一 if(条件表达式){ 执行语句1; }else{ 执行语句2; } 格式三: 多选一 if(条件表达式1 ...
- dp(传球)
https://ac.nowcoder.com/acm/contest/1126/B 链接:https://ac.nowcoder.com/acm/contest/1126/B来源:牛客网 上体育课的 ...
- python 导入json模块的用法
json用于字符串,和 python数据类型间进行转换,json模块有四个功能,dumps,dump,loads,load. json 用法 json.dumps 将数据通过特殊的形式转换为所有程序语 ...
- CSS的重用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...