JavaScript 复杂判断更优雅写法

通常我们会用if/else  switch实现多个条件判断,当条件过多时,代码就显得很臃肿,不那么优雅
我们可以这样来优化:

通常我们会这样写:

/**
     * 按钮点击事件
     * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 商品售罄 4 开团成功 5 系统取消
     */
const onButtonClick = (status)=>{
      if(status == 1){
        sendLog('processing')
        jumpTo('IndexPage')
      }elseif(status == 2){
        sendLog('fail')
        jumpTo('FailPage')
      }elseif(status == 3){
        sendLog('fail')
        jumpTo('FailPage')
      }elseif(status == 4){
        sendLog('success')
        jumpTo('SuccessPage')
      }elseif(status == 5){
        sendLog('cancel')
        jumpTo('CancelPage')
      }else {
        sendLog('other')
        jumpTo('Index')
      }
    }

const onButtonClick = (status)=>{
      switch (status){
        case1:
          sendLog('processing')
          jumpTo('IndexPage')
          break
        case2:
        case3:
          sendLog('fail')
          jumpTo('FailPage')
          break
        case4:
          sendLog('success')
          jumpTo('SuccessPage')
          break
        case5:
          sendLog('cancel')
          jumpTo('CancelPage')
          break
        default:
          sendLog('other')
          jumpTo('Index')
          break
      }
    }

优化:

方案一(对象形式)

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 开团成功
     */const onButtonClick = (status)=>{
      let action = actions[status] || actions['default'],
          logName = action[0],
          pageName = action[1]
          sendLog(logName)    
          jumpTo(pageName)
    }

方案二(Map对象)

const actions = newMap([
      [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 开团成功 
     */const onButtonClick = (status)=>{
      let action = actions.get(status) || actions.get('default')
      sendLog(action[0])
      jumpTo(action[1])
    }

对象形式和Map对象区别在于:

普通对象形式的key值只能是字符串或者Symbol,但是Map的值可以是任意值,甚至是正则表达式

多元条件判断

/**
 * 按钮点击事件
 * @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
    }
  }
}

优化:

核心是将两个条件拼接成字符串,然后将该字符串用作为key值

方案一

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

方案二

/*
* 和map对象同理
*/

const actions = {
  'guest_1':()=>{/*do sth*/},
  'guest_2':()=>{/*do sth*/},
  //....
}

const onButtonClick = (identity,status)=>{
  let action = actions[`${identity}_${status}`] || actions['default']
  action.call(this)
}

升级版本

假如guest情况下,status1-4的处理逻辑都一样,可以这样写:

const actions = ()=>{
  const functionA = ()=>{/*do sth*/}
  const functionB = ()=>{/*do sth*/}
  return new Map([
    [{identity:'guest',status:1},functionA],
    [{identity:'guest',status:2},functionA],
    [{identity:'guest',status:3},functionA],
    [{identity:'guest',status:4},functionA],
    [{identity:'guest',status:5},functionB],
    //...
  ])
}

const onButtonClick = (identity,status)=>{
  let action = [...actions()].filter(([key,value])=>(key.identity == identity && key.status == status))
  action.forEach(([key,value])=>value.call(this))
}

常人想不到的方式

利用Map对象的key值可以是任何值的特性;

这里将正则作为key值

const actions = ()=>{
  const functionA = ()=>{/*do sth*/}
  const functionB = ()=>{/*do sth*/}
  const functionC = ()=>{/*send log*/}
  return new Map([
    [/^guest_[1-4]$/,functionA],
    [/^guest_5$/,functionB],
    [/^guest_.*$/,functionC],
    //...
  ])
}

const onButtonClick = (identity,status)=>{
  let action = [...actions()].filter(([key,value])=>(key.test(`${identity}_${status}`)))
  action.forEach(([key,value])=>value.call(this))
}

学到就是赚到,赶紧用起来

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
很好的问题!在 JavaScript 中,可以使用逻辑或运算符(“||”)将多个条件组合起来,实现多重判断的功能。同时,为了确保代码的可读性和代码风格的美观,可以使用一些技巧来编优雅的多重判断语句。 以下是几种值得推荐的写法: 1. 使用默认值:在变量赋值时,使用逻辑或运算符“||”,将变量原值和一个默认值作为两个操作数,如果变量原值是假值(false、null、undefined、0、NaN、""),则将默认值赋给变量,否则将原值作为变量的值。这种写法可以避免使用 if 语句进行多重判断。 例如: ```javascript // 简单示例 var foo = bar || 0; // 多重判断示例 var value = option1 || option2 || option3 || defaultOption; ``` 2. 使用三元运算符:在变量赋值时,使用三元运算符(“?:”),将多重判断转换为一条语句。这种写法可以在某些情况下提高代码的可读性,尤其是只有两个选项的场合。 例如: ```javascript // 简单示例 var result = condition ? value1 : value2; // 多重判断示例 var result = option1 ? value1 : (option2 ? value2 : (option3 ? value3 : defaultValue)); ``` 3. 使用数组方法:将多个选项放在一个数组中,然后使用数组方法来进行多重判断。这种写法可以让代码加简洁、易读。 例如: ```javascript // 简单示例 var maxNumber = Math.max.apply(null, numberArray); // 多重判断示例 var value = [option1, option2, option3].find(Boolean) || defaultValue; ``` 希望这些写法对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

superTiger_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值