溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

javascript中如何消除if else

發(fā)布時間:2020-10-14 15:10:07 來源:億速云 閱讀:316 作者:小新 欄目:web開發(fā)

這篇文章主要介紹了javascript中如何消除if else,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

場景一: 根據(jù)status顯示對應(yīng)名稱

優(yōu)化方案1:object對象

const statusStr = {
  '1': '待付款',
  '2': '待發(fā)貨',
  '3': '已發(fā)貨',
  '4': '交易完成',
  '5': '交易關(guān)閉',
  'default': '',
}
const getStatus = (status) =>{
  return statusStr[status] || statusStr['default']
}

將判斷條件作為對象的屬性名,將處理邏輯作為對象的屬性值,在按鈕點擊的時候,通過對象屬性查找的方式來進行邏輯判斷.

優(yōu)化方案2: Map對象

const statusStr = new map([
  '1': ['待付款'],
  '2': ['待發(fā)貨'],
  '3': ['已發(fā)貨'],
  '4': ['交易完成'],
  '5': ['交易關(guān)閉'],
  'default': [''],
])
const getStatus = (status) =>{
  let actions = statusStr.get(status) || statusStr.get('default')
  return  actions[0];
}

這樣寫用到了es6里的Map對象,那么Map對象和Object對象有什么區(qū)別呢?

一個對象通常都有自己的原型,所以一個對象總有一個"prototype"鍵。 一個對象的鍵只能是字符串或者Symbols,但一個Map的鍵可以是任意值。 你可以通過size屬性很容易地得到一個Map的鍵值對個數(shù),而對象的鍵值對個數(shù)只能手動確認。

場景二:多個condition對應(yīng)名稱

現(xiàn)在把問題升級一下, 以前按鈕點擊時候只需要判斷status,現(xiàn)在還需要判斷用戶的身份:
「舉個栗子:」

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

上面的例子我們可以看到,當你的邏輯升級為二元判斷時,你的判斷量會加倍,你的代碼量也會加倍,這時怎么寫更清爽呢?

優(yōu)化方案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)
}

上述代碼核心邏輯是:把兩個條件拼接成字符串,并通過以條件拼接字符串作為鍵,以處理函數(shù)作為值的Map對象進行查找并執(zhí)行,這種寫法在多元條件判斷時候尤其好用。

優(yōu)化方案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)
}

優(yōu)化方案3: 將condition用Object對象形式存在Map對象里

可能用查詢條件拼成字符串有點別扭,那還有一種方案,就是用Map對象,以O(shè)bject對象作為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))
}

場景三:根據(jù)status做出相應(yīng)操作

「舉個栗子:」

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) {
            // ...
        }
    }
}

優(yōu)化方案1: 查找表,職責(zé)鏈查找表

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 < rules.length; i++) {
        // 如果返回true
        if (rules[i].match(an, old)) {
            rules[i].action(an, old)
        }
    }
}
init(isAnswer, isOldUser)

雖然可能看著是治標不治本,其實不然,init函數(shù)的復(fù)雜度大大的降低了。我們已經(jīng)把控制流程的復(fù)雜邏輯,拆分到determineAction函數(shù)中

優(yōu)化方案2: 函數(shù)式編程

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'

場景四: 根據(jù)范圍去進行不同處理

「舉個栗子:」比如大家可能會遇到類似下面的需求:比如某平臺的信用分數(shù)評級,超過700-950,就是信用極好,650-700信用優(yōu)秀,600-650信用良好,550-600信用中等,350-550信用較差。

function showGrace(grace) {
    let _level='';
    if(grace>=700){
        _level='信用極好'
    }
    else if(grace>=650){
        _level='信用優(yōu)秀'
    }
    else if(grace>=600){
        _level='信用良好'
    }
    else if(grace>=550){
        _level='信用中等'
    }
    else{
        _level='信用較差'
    }
    return _level;
}

優(yōu)化方案1: 用look-up表,把配置數(shù)據(jù)和業(yè)務(wù)邏輯分離

function showGrace(grace,level,levelForGrace) {
    for(let i=0;i<level.length;i++){
        if(grace>=level[i]){
            return levelForGrace[i];
        }
    }
    //如果不存在,那么就是分數(shù)很低,返回最后一個
    return levelForGrace[levelForGrace.length-1];
}
let graceForLevel=[700,650,600,550];
let levelText=['信用極好','信用優(yōu)秀','信用良好','信用中等','信用較差'];

小結(jié)

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

感謝你能夠認真閱讀完這篇文章,希望小編分享javascript中如何消除if else內(nèi)容對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI