• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 消除if else, 让你的代码看起来更优雅

消除if else, 让你的代码看起来更优雅

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了消除if else,代码看起来更优雅等相关知识,希望对您有所帮助

今天给大家介绍如何消除if else, 让你的代码看起来更优雅,一起来看看吧。

前言

应该有不少同学有遇到过充斥着if else的代码,面对这样的一团乱麻,简单粗暴地继续增量修改常常只会让复杂度越来越高,可读性越来越差。那么是时候重构了,花几分钟看看这篇文章, 说不定对你有一丢丢帮助。

场景一: 根据status显示对应名称

优化方案1:object对象

const statusStr = {  '1': '待付款',  '2': '待发货',  '3': '已发货',  '4': '交易完成',  '5': '交易关闭',  'default': '',}const getStatus = (status) =>{  return statusStr[status] || statusStr['default']}

将判断条件作为对象的属性名,将处理逻辑作为对象的属性值,在按钮点击的时候,通过对象属性查找的方式来进行逻辑判断.

优化方案2: Map对象

const statusStr = new map([  '1': ['待付款'],  '2': ['待发货'],  '3': ['已发货'],  '4': ['交易完成'],  '5': ['交易关闭'],  'default': [''],])const getStatus = (status) =>{  let actions = statusStr.get(status) || statusStr.get('default')  return  actions[0];}

这样写用到了es6里的Map对象,那么Map对象和Object对象有什么区别呢?

一个对象通常都有自己的原型,所以一个对象总有一个"prototype"键。 一个对象的键只能是字符串或者Symbols,但一个Map的键可以是任意值。 你可以通过size属性很容易地得到一个Map的键值对个数,而对象的键值对个数只能手动确认。

场景二:多个condition对应名称

现在把问题升级一下, 以前按钮点击时候只需要判断status,现在还需要判断用户的身份:
「举个栗子:」

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    }  }}

上面的例子我们可以看到,当你的逻辑升级为二元判断时,你的判断量会加倍,你的代码量也会加倍,这时怎么写更清爽呢?

优化方案1: 将condition用字符拼接形式存在Map对象里

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*/}],])const onButtonClick = (identity,status)=>{  let action = actions.get(`${identity}_${status}`) || actions.get('default')  action.call(this)}

上述代码核心逻辑是:把两个条件拼接成字符串,并通过以条件拼接字符串作为键,以处理函数作为值的Map对象进行查找并执行,这种写法在多元条件判断时候尤其好用。

优化方案2: 将condition用字符拼接形式存在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)}

优化方案3: 将condition用Object对象形式存在Map对象里

可能用查询条件拼成字符串有点别扭,那还有一种方案,就是用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))}

场景三:根据status做出相应操作

「举个栗子:」

function init () {    if (isAnswer === 1) {        if (isOldUser === 1) {            // ...        } else if (isOldUser === 2) {            // ...        }    } else if (isAnswer === 2) {        if (isOldUser === 1) {            // ...        } else if (isOldUser === 2) {            // ...        }    } else if (isAnswer === 3) {        if (isOldUser === 1) {            // ...        } else if (isOldUser === 2) {            // ...        }    }}

优化方案1: 查找表,职责链查找表




 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 消除if else, 让你的代码看起来更优雅

相关文章

  • 帝国cms搜索结果显示数量设置教程
  • Phpcms V9调用Discuz X2.5论坛最新帖、最热帖、热门版
  • Angular中怎么自定义视频播放器
  • 提高关键词排名的28个SEO技巧
  • PHPCMS邮箱不能发送邮件?
  • 如何解决centos6终端乱码问题
  • 帝国CMS灵动标签去除重复标题信息
  • Mysql怎么查看字段的属性值
  • 关于laravel5.6与thinkphp3.2使用redis共享session的方案
  • 技术教程:如何安装ioncube扩展

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • 怎么解决phpmyadmin显示MySQL数据表“使用中” 修复后依然无效的问题
    • DEDECMS的优化方案
    • 关于vue-cli4+laravel8使用JWT登录及token验证
    • Composer安装时要求输入授权用户名密码是怎么回事
    • 利用视频网站加快百度及谷歌的重新收录的SEO技
    • Photoshop绘制超酷的3D门牌艺术字教程
    • 详解PHP中的PDO::quote(附代码实例)
    • 详解thinkphp ajaxfileupload异步上传图片
    • BootstrapTable如何重新加载数据?3种方式了解一下!
    • PHP微信小程序解包过程实例详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有