国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何優化JavaScript中的復雜判斷?

開發 前端
我們在寫JavaScript代碼的時候,經常會遇到邏輯判斷比較復雜的情況,通常我們可以使用if/else或者switch來實現多個條件判斷。

我們在寫JavaScript代碼的時候,經常會遇到邏輯判斷比較復雜的情況,通常我們可以使用if/else或者switch來實現多個條件判斷。

但是有一個問題,隨著邏輯復雜度的增加,代碼中的if/else/switch會越來越臃腫,難以理解。那么如何才能寫出更優雅的判斷邏輯呢?

示例:

/**
 * Button click event
 * @param {number} status:1 2 3 4 5
 */
const onButtonClick = (status)=>{
  if(status == 1){
    jumpTo('IndexPage')
  }else if(status == 2){
    jumpTo('FailPage')
  }else if(status == 3){
    jumpTo('FailPage')
  }else if(status == 4){
    jumpTo('SuccessPage')
  }else if(status == 5){
    jumpTo('CancelPage')
  }else {
    jumpTo('Index')
  }
}

從代碼中我們可以看到這個按鈕的點擊邏輯:根據不同的活動狀態,做兩件事,發送日志事件,跳轉到對應頁面。大家很容易就提出使用 switch 進行代碼重寫方案:

const onButtonClick = (status)=>{
  switch (status){
    case 1:
      console.log('IndexPage')
      break
    case 2:
    case 3:
      jumpTo('FailPage')
      break  
    case 4:
      jumpTo('SuccessPage')
      break
    case 5:
      jumpTo('CancelPage')
      break
    default:
      jumpTo('Index')
      break
  }
}

這樣看起來比用 if/else 清晰多了,你還發現了一個小技巧:當 case 2 和 case 3 的邏輯相同時,可以省略執行語句和 break,這樣 case 2 的邏輯就會自動執行 case 3 的邏輯。

持續優化:

const actions = {
  '1': ['IndexPage'],
  '2': ['FailPage'],
  '3': ['FailPage'],
  '4': ['SuccessPage'],
  '5': ['CancelPage'],
  'default': ['Index'],
}
const onButtonClick = (status)=>{
  let action = actions[status] || actions['default'],
  jumpTo(action[0])
}

現在代碼確實看起來干凈多了,這個方法的巧妙之處在于:把判定條件作為對象的屬性名,把處理邏輯作為對象的屬性值,點擊按鈕時通過查找對象屬性進行邏輯判斷,這種寫法特別適合一元條件判斷。

還有其他寫法嗎?用map:

const actions = new Map([
  [1, ['IndexPage']],
  [2, ['FailPage']],
  [3, ['FailPage']],
  [4, ['SuccessPage']],
  [5, ['CancelPage']],
  ['default', ['Index']]
])
const onButtonClick = (status)=>{
  let action = actions.get(status) || actions.get('default')
  jumpTo(action[0])
}

這樣寫的話,就用到了ES6中的Map對象,是不是感覺順暢多了?Map對象和Object有什么區別?

  • 對象通常有自己的原型,所以對象總有一個原型鍵。
  • 對象的鍵只能是字符串或者Symbol,而Map的鍵可以是任意值。

Map中鍵值對的數量可以通過size屬性輕松獲取,而對象中鍵值對的數量只能手動確認。

復雜一點的話,再加一層判斷如何?

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

從上面的例子我們可以看出,當你的邏輯升級為二元判斷的時候,判斷量和代碼量都會翻倍,這時候怎么才能寫得更干凈呢?

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 對象查找并執行。這種方法在做多條件判斷的時候特別有用。

當然,使用 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)
}

如果把查詢條件拼接成字符串感覺有點別扭的話,還有另外一個解決辦法,就是使用一個以 Object 對象為鍵的 Map 對象:

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

這里我們也可以看出Map和Object的區別,Map可以使用任意類型的數據作為key。

我們再增加一點難度,假設一個客人的情況,狀態1-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))
}

這樣寫已經可以滿足日常需求了。

不過說真的,重寫 functionA 四次還是有點麻煩的。如果情況變得特別復雜,比如,身份有三種狀態,狀態有十種狀態,那么就需要定義 30 個處理邏輯。

而且往往這些邏輯很多都是相同的,這看起來有點讓人難以接受。那么可以這樣實現:

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


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

這里 Map 的優勢就更加凸顯了,它允許使用正則類型作為鍵,這帶來了無限可能。假設需求發生了變化,每個客人場景都需要發送日志事件,不同的狀態場景也需要單獨的邏輯處理。那么,我們可以這樣寫:

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

也就是說,利用數組循環的特性,滿足正則表達式條件的邏輯就會被執行,這樣就可以同時執行通用邏輯和個別邏輯。有了正則表達式的存在,你可以發揮你的想象力,解鎖更多的可能性。

責任編輯:華軒 來源: web前端開發
相關推薦

2024-10-07 12:23:03

字符串Map對象

2025-04-27 03:44:00

JavaScript代碼函數

2025-04-25 08:50:00

JavaScript代碼開發

2009-06-11 17:15:23

JavaScript性

2009-06-10 22:00:57

JavaScript腳

2020-10-22 14:00:31

JavaScript數字變量

2020-10-22 08:06:05

JavaScrip語言類型

2025-10-15 08:00:00

防抖技術JavaScript

2016-08-03 17:23:47

javascripthtml前端

2022-09-12 23:53:53

JavaScript條件判斷開發

2011-05-27 16:00:10

DB2

2013-08-01 13:18:41

代碼

2022-09-04 15:40:39

JavaScrip狀態模式軟件

2020-08-23 11:32:21

JavaScript開發技術

2011-05-25 10:46:39

Javascript

2025-01-07 15:20:24

2024-06-14 08:54:54

2020-11-27 10:25:36

物聯網設備軟件

2011-07-13 09:46:23

javaScript

2012-03-12 09:33:04

JavaScript
點贊
收藏

51CTO技術棧公眾號

91精品啪在线观看国产81旧版| av一本久道久久综合久久鬼色| 国产精品久久久久一区二区| 91精品国产91久久久久久最新 | 白白在线精品| 久久久精品999| 日日躁夜夜躁人人揉av五月天| 欧美午夜精品| 天天人人精品| 99久久久精品| 久草在线在线| 欧美大胆一级视频| 国产精品一区二区三区四区在线观看| 久久免费视频在线| 一区在线播放| 欧美老熟妇喷水| 动漫精品一区二区| 天堂av中文在线| 欧美—级高清免费播放| 国产精品7m凸凹视频分类| 亚洲一二在线观看| 精品一区二区男人吃奶| 国产精品9999久久久久仙踪林| 国内精品免费**视频| 99视频在线视频| 色综合天天综合网天天看片| 欧美精品成人网| 欧美性猛交xxxxx免费看| av在线私库| 57pao成人永久免费视频| 国产精品毛片在线| 牛夜精品久久久久久久| 欧美精选在线播放| 久久av日韩| 亚洲国产精品一区二区三区| av综合网站| 亚洲国产午夜伦理片大全在线观看网站| 久久蜜桃一区二区| 香蕉视频网站在线观看| 久久这里有精品| 狠狠综合久久| 91福利国产成人精品播放| 日韩视频免费直播| 亚洲a级精品| 热久久最新地址| 日本精品一级二级| 福利欧美精品在线| 五月天色一区| 天天色综合成人网| 日韩高清一区| 久久久一二三四| 色婷婷久久一区二区三区麻豆| 日韩精品中文字幕吗一区二区| 精品欧美一区二区三区久久久| 亚洲欧美国产三级| 精品国产黄a∨片高清在线| 蜜桃臀一区二区三区| 亚洲国产精品天堂| 国产精品视频一区二区三区| 日韩av一区二区三区在线| 亚洲电影在线免费观看| 日韩高清一区| 粉嫩av一区二区三区天美传媒| 欧美日韩精品专区| 日韩欧美自拍| 色偷偷亚洲女人天堂观看欧| 亚洲性视频网站| 日韩在线一区二区三区| 国产综合在线观看| 欧美日韩亚洲视频一区| 91在线一区| 亚洲中文字幕无码av永久| 日韩精品中文字幕一区| 在线不卡视频| 国产视频网站在线| 成人激情综合网| 伊人色综合久久天天人手人婷| 超碰97在线免费| 久久激情视频久久| 国产一区二区精品在线观看| 青草视频在线观看视频| 日韩一区二区三区在线视频| 激情国产一区| 香蕉国产在线| 国产精品女主播| 亚洲男人的天堂在线观看| 四虎影视成人精品国库在线观看| 日韩第一页在线观看| 日韩欧美亚洲一区二区| 亚洲神马久久| 好操啊在线观看免费视频| 91免费人成网站在线观看18| 午夜伦欧美伦电影理论片| 成人高清电影网站| 一二三四社区在线视频6| 国产美女精品视频免费观看| 一区二区三区在线视频播放| 神马影视一区二区| 国产成人看片| 色婷婷精品久久二区二区蜜臀av| 日韩1区在线| 在线观看视频污| 国产在线拍偷自揄拍精品| 亚洲国产va精品久久久不卡综合| 日产精品一区二区| 欧美日本网站| 久久riav二区三区| 精品国产凹凸成av人导航| 国产在线精品一区二区夜色| 性感美女一区二区在线观看| 91视频 -- 69xx| 俺去了亚洲欧美日韩| 日韩色视频在线观看| 亚洲国产不卡| 麻豆av电影在线观看| 亚洲xxx自由成熟| 图片婷婷一区| 好男人看片在线观看免费观看国语| 欧美中文在线视频| 天天综合色天天| 美国av在线播放| 欧美精品在线观看一区二区| 噜噜噜91成人网| 色综合亚洲图丝熟| 黄色影院一级片| 国产精品91免费在线| 欧美日韩视频不卡| 国产一区二区三区蝌蚪| gogo久久日韩裸体艺术| 一级片免费在线| 欧美一区二区影视| 国产小视频国产精品| 国产精品午夜春色av| 婷婷av在线| 高清欧美精品xxxxx| 97精品一区二区视频在线观看| 午夜视频在线观看一区二区| 欧美日韩三级电影在线| 九色porny丨首页入口在线| 37pao成人国产永久免费视频| 国产精品视频一区二区三区四| 欧美日韩激情一区| 成人av免费在线观看| 久久成人av| 丰满大乳少妇在线观看网站| 无遮挡又爽又刺激的视频| 91在线直播亚洲| 国产一区二区日韩| 午夜激情一区二区三区| 国产一二三精品| 欧美激情偷拍自拍| 欧美极品影院| 视频一区二区三区在线看免费看| 成人在线免费高清视频| 国产精品视频99| 一本色道久久88综合日韩精品| 亚洲精品视频在线| 久久99精品久久久久婷婷| 欧美freesex8一10精品| 暖暖在线中文免费日本| 国产精品区在线| 日韩高清av电影| 日本韩国在线不卡| 精品亚洲永久免费精品| 亚洲日本久久| 最近中文字幕mv免费高清在线| 午夜精品短视频| 午夜精品福利在线观看| 欧美xxxxx牲另类人与| 中文字幕佐山爱一区二区免费| 久久福利一区| 精品国产99| 色成人免费网站| 成人午夜电影在线观看| 亚洲欧美另类动漫| 亚洲巨乳在线观看| 成人激情电影一区二区| 久久精品视频亚洲| 6080国产精品一区二区| 亚洲欧美日韩一区二区 | 日韩福利影视| 欧美精品电影| 久草视频在线播放| 97av视频在线观看| 日韩国产欧美精品| 国产主播欧美精品| 欧美精品午夜视频| 亚洲成人精品久久| 日韩欧美国产网站| 国产精品久久久久aaaa樱花| 国产精品99久久久久久宅男| 国产第一页在线| 白白色在线发布| 国产精品亚洲二区在线观看| 一区二区三区电影| 免费在线观看91| 成人免费视频视频在| 国产精品第三页| 8090成年在线看片午夜| 在线播放日韩精品|