Skip to content

逻辑判断多种形式

1. if else

javascript
/**
 * 按钮点击事件
 * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 商品售罄 4 开团成功 5 系统取消
 */
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')
  }
}

2. switch 改写

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

3. 对象改写

以类型做 key,相应逻辑跳转为 value

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

4. Map 改写

javascript
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])
}

拓展:双重判断条件

1. 对象改写

javascript
const actions = {
  guest_1: ['processing', 'IndexPage'],
  guest_2: ['fail', 'FailPage'],
  guest_3: ['fail', 'FailPage'],
  guest_4: ['success', 'SuccessPage'],
  master_5: ['cancel', 'CancelPage'],
  default: ['other', 'Index'],
}
/**
 * 按钮点击事件
 * @param {string} identity 身份标识:guest客态 master主态
 * @param {number} status 活动状态:1 开团进行中 2 开团失败 3 开团成功 4 商品售罄 5 有库存未开团
 */

const onButtonClick = (identity, status) => {
  let action = actions[`${identity}_${status}`] || actions['default'],
    logName = action[0],
    pageName = action[1]
  sendLog(logName)
  jumpTo(pageName)
}

2. Map 改写,以字符串为 key,并将处理逻辑做 value

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

3. Map: 以对象做 key,处理逻辑为 value

javascript
如果有些同学觉得把查询条件拼成字符串有点别扭,那还有一种方案,就是用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))
}

4. 处理逻辑相同的情况处理

将处理逻辑函数进行缓存:

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

5. 更进一步,利用正则匹对

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

主要利用了 map 的 key 可以为任意类型。

  • if/else
  • switch
  • 一元判断时:存到 Object 里
  • 一元判断时:存到 Map 里
  • 多元判断时:将 condition 拼接成字符串存到 Object 里
  • 多元判断时:将 condition 拼接成字符串存到 Map 里
  • 多元判断时:将 condition 存为 Object 存到 Map 里
  • 多元判断时:将 condition 写作正则存到 Map 里

君子慎独