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

javascript栏目介绍如何消除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: 查找表,职责链查找表

const rules = [    {        match (an, old) {if (an === 1) {return true}},        action (an, old) {        if (old === 1) {// ...}         else if (old === 2) {// ...}        }    },    {        match (an, old) { if (an === 2) {return true } },        action (an, old) {            if (old === 1) {// ...}             else if (old === 2) {// ...}        }    },    {        match (an, old) {if (an === 3) {return true}},        action (an, old) {            if (old === 1) {// ...}             else if (old === 2) {// ...}        }    }]function init (an, old) {    for (let i = 0; i 

虽然可能看着是治标不治本,其实不然,init函数的复杂度大大的降低了。我们已经把控制流程的复杂逻辑,拆分到determineAction函数中

优化方案2: 函数式编程

import R from 'ramda'var fn = R.cond([  [R.equals(0),   R.always('water freezes at 0°C')],  [R.equals(100), R.always('water boils at 100°C')],  [R.T,           temp => 'nothing special happens at ' + temp + '°C']]);fn(0); //=> 'water freezes at 0°C'fn(50); //=> 'nothing special happens at 50°C'fn(100); //=> 'water boils at 100°C'

登录后复制

场景四: 根据范围去进行不同处理

「举个栗子:」比如大家可能会遇到类似下面的需求:比如某平台的信用分数评级,超过700-950,就是信用极好,650-700信用优秀,600-650信用良好,550-600信用中等,350-550信用较差。

function showGrace(grace) {    let _level='';    if(grace>=700){        _level='信用极好'    }    else if(grace>=650){        _level='信用优秀'    }    else if(grace>=600){        _level='信用良好'    }    else if(grace>=550){        _level='信用中等'    }    else{        _level='信用较差'    }    return _level;}

登录后复制

优化方案1: 用look-up表,把配置数据和业务逻辑分离

function showGrace(grace,level,levelForGrace) {    for(let i=0;i=level[i]){            return levelForGrace[i];        }    }    //如果不存在,那么就是分数很低,返回最后一个    return levelForGrace[levelForGrace.length-1];}let graceForLevel=[700,650,600,550];let levelText=['信用极好','信用优秀','信用良好','信用中等','信用较差'];

登录后复制

小结

很多情况下我们都可以使用更灵活的方式去替代if else以及switch, 但也不是所有的if else都需要替代, 视情况而定。

更多相关免费学习:javascript(视频)

以上就是消除if else, 让你的代码看起来更优雅的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2725301.html

(0)
上一篇 2025年3月7日 23:22:08
下一篇 2025年3月7日 23:22:17

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • js数组如何删除指定元素

    js数组删除指定元素的方法:首先给js数组对象定义一个函数,用于查找指定的元素在数组中的位置,即索引;然后通过得到的指定元素的索引,使用对应函数来删除指定元素。 首先可以给JS的数组对象定义一个函数,用于查找指定的元素在数组中的位置,即索引…

    2025年3月7日
    200
  • js json字符串如何转json对象

    js json字符串转json对象的方法:1、使用“$.parseJSON( jsonstr );”将json字符串转换成json对象;2、使用“eval(‘(‘ + jsonstr + ‘)&#8217…

    2025年3月7日
    200
  • js怎么将字符串转为数组?

    方法:1、使用split()方法,可以将给定字符串str拆分为字符串数组,语法“str.split(separator)”,separator指定分割的地方;2、使用Array.from()方法,字符串的每个字母都转换为新数组实例的元素。 …

    2025年3月7日 编程技术
    200
  • js的原型和原型链是什么

    js的原型和原型链是:1、原型模式是用于创建重复的对象,同时又能保证性能,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式;2、原型链是原型对象创建过程的历史记录,当访问一个对象的某个属性时,会先在这个对象本身属性上查找。 …

    2025年3月7日
    200
  • js如何调用php

    js调用php的方法:首先在页面【a.html】中调用相关语句,并在【b.php】中加入相关代码;然后当执行【a.html】文件时,就会调用【b.php】文件,并将【b.php】文件的输出作为JS语句来执行。 js调用php的方法: 举一个…

    2025年3月7日
    100
  • js怎么获取css属性

    js获取css属性的方法:使用【getComputedStyle(div)】方法获取,代码为【var a = document.defaultView.getComputedStyle(div);】。 【相关文章推荐:vue.js】 js获…

    2025年3月7日
    200
  • js框架与css框架的区别是什么

    js框架与css框架的区别是:1、js框架可以单独使用,不依赖css框架;2、有些css框架依赖于js才能实现一些效果;3、js框架是为了简化开发,规范项目,而css框架简化的是搭建界面的工作量。 js框架与css框架的区别如下: (视频教…

    2025年3月7日
    200
  • 原生js实现年份轮播选择效果

    相关免费学习推荐:javascript(视频) 文章目录 前言一、思路是什么?二、全部代码1. html2.js2.css总结 前言 用js实现一个年份轮换选择效果。废话不多说,看图: 一、思路是什么? 布局: 左右箭头使用实体字符 年份5…

    2025年3月7日
    200
  • js怎么替换所有指定字符串

    js替换所有指定字符串的方法:首先打开相应的js文件;然后通过“str.replace(//g, ‘!’)”方法进行全局替换即可。 本教程操作环境:windows7系统、Dell G3电脑。 js 替换所有指定的字符…

    2025年3月7日
    200
  • 介绍JS实现五子棋界面设计

    免费学习推荐:js视频教程 需求分析以及代码实现 第一节 画布样式布局 1. canvas进行画布的设计 新建CSS文件夹,新建style.css文件; 在style.css文件里进行canvas编写; canvas{ display: b…

    2025年3月7日 编程技术
    200

发表回复

登录后才能评论