亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

其實你可以少寫點if else與switch(推薦)

2024-05-06 16:47:40
字體:
來源:轉載
供稿:網友

前言

作為搬磚在第一線的底層工人,業務場景從來是沒有做不到只有想不到的復雜。

不過他強任他強,if-else全搞定,搬就完了。但是隨著業務迭代或者項目交接,自己在看自己或者別人的if代碼的時候,心情就不再表述了,各自深有體會。所以我們一起看看if還能怎么寫

最基本if-else

假設有這么個場景,不同情況下打印不同值。

因為涉及到的條件太多,就不提三目運算之類優化了。

if (a == 1) { console.log('a1')} else if (a == 2) { console.log('b2')} else if (a == 3) { console.log('c3')} else if (a == 4) { console.log('d4')}/* n..... */

現在還算能看,因為邏輯簡單,如果邏輯復雜,迭代多個版本之后,你還敢動嗎。

每動一下就戰戰兢兢,誰知道哪里會遺漏。

那么換種方式呢

switch-case

這樣稍微清晰那么一點,差別好像沒什么差別:

switch(a){ case 1:  console.log('a1');  break; /* 省略。。。 */  case 40:  console.log('a40');  break;}

分離配置信息與執行動作

object映射

定義一個object作為配置對象來存放不同狀態,通過鏈表查找

const statusMap = { 1:()=>{  console.log('a1') }, 2:()=>{  console.log('b2') } /* n.... */}// 執行let a = 1 statusMap[a || 1]()

這樣比較清晰,將條件配置與具體執行分離。如果要增加其他狀態,只修改配置對象即可。

數組映射

當然在某些狀態下可以使用數組,來做這個配置對象。

// 這里就涉及其他優化了,例如將執行函數抽離出來,大家不要關注func的內容就好。// 它就是個function,內容很復雜const statusArr = [function(){ console.log(1)}, function () {  console.log(2) },]// 執行let a = 1statusArr[a || 1]()

數組的要求更高一點,如果是其他key,例如字符串,那么數組就不能滿足需求了

升級版:不同key相同value

這樣看起來好一點了,那么需求又有變動了,

前面是每種處理方式都不同,下面有幾種情況下處理函數相同的,

例如1-39的時候,調用a,40之后調用b,如果我們繼續來用映射的方式來處理。

function f1 (){ console.log(1)}function f2 (){ console.log(2)}const statusMap={ 1:f1, 2:f1, 3:f1, 4:f1, //省略 40:f2}let a = 2statusMap[a]()

這樣當然也可以,不過重復寫那么多f1,代碼看起來不夠簡潔。

開始重構之前我們先捋一下思路,無非是想把多個key合并起來,對應一個value。

也就是說我們的鍵值不是字符串而是個數組,object顯然只支持字符串,

那么可以將這么多key合并成一個:'1,2,3,4,..,9'。

但是查找的時候有點問題了,我們的參數肯定不能完全匹配。

接著走下去,是不是做個遍歷加個判斷,包含在子集內的都算匹配,那么代碼看起來就是下面這個樣子。

// 將鍵值key設置為一個拼接之后的字符串const statusMap = { '1,2,3,4,5': f1, //省略 40: f2}// 獲取所有的鍵值,待會遍歷用const keys = Object.keys(statusMap), len = keys.length// 遍歷獲取對應的值 const getVal=(param='')=>{ // 用for循環的原因在于匹配之后就不需要繼續遍歷 for (let i = 0; i < len; i++) {  const key = keys[i],   val = statusMap[key]  // 這里用什么來判斷就隨便了,兩個字符串都有。   if (key.includes(param)) {   return val  } }}let a = 2, handle = getVal(a)handle() // 1

但是這樣來看,增加了個遍歷的過程,而且是拼接字符串,萬一哪天傳了個逗號進來,會得到了預料之外的結果。

map

es6有個新的數據結構Map,支持任意數據結構作為鍵值。如果用Map可能更清晰一點。

/** * map鍵值索引的是引用地址, * 如果是下面這樣的寫法不好意思,永遠得不到值 * map1.set([1,4,5],'引用地址') * map1.get([1,4,5]) //輸出為undefined * 就像直接訪問 * map1.get([1,2,3,4,5]) //同樣為undefined */const map1 = new Map()const statusArr = [1,2,3,4,5]map1.set(statusArr,f1)// 預設默認值,因為不能直接遍歷let handle = function(){}const getVal = (param = '') => {for (let value of map1.entries()) { console.log(JSON.stringify(value)) if (value[0].includes(param)){  console.log(value)  // 不能跳出 只能處理了  handle = value[1] }}}const a = 2getVal(a)handle()

個人而言雖然這樣減少了重復代碼,但是又增加了一步匹配值的操作,優劣就見仁見智吧。

二維數組

肯定有部分人就是不想做遍歷的操作,既然一個數組不能滿足,那么兩個數組呢。

// 鍵值數組和value 保持對應關系const keyArr = ['1,2,3,4,5','40']const valArr = [f1,f2]const getVal = (param = '')=>{ // 查找參數對應的下標 let index = keyArr.findIndex((it)=>{  return it.includes(param) }) // 獲取對應值 return valArr[index]}let a = 2, handle = getVal(a)handle()

利用數組提供的下標,將key和value對應起來,進而獲取想要的值。

這里一直沒有達到我最初的目的,即鍵里面重復的數組,可以不通過多余操作匹配到,上面不管怎么樣都進行了處理,這不是懶人的想要的。

總結

這是在寫業務需求的時候做的一點總結,數組和對象的映射可能大家都在用。當遇到了不同key相同value的情況時,從懶出發不像重復羅列,就嘗試了下。當然了,因為個人水平問題,肯定有更好的處理方式,歡迎一起討論,拋磚引玉共同進步。此外現有成熟的庫里loadsh也是可以到達目的,不過自己思考過之后再去看大神的作品理解會更深入一點。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美在线免费| 国产精品69av| 亚洲欧美中文另类| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲另类图片色| 国产亚洲人成网站在线观看| 97国产成人精品视频| 久久久99免费视频| 欧美成人免费一级人片100| 久久97久久97精品免视看| 欧美性受xxxx白人性爽| 欧美日韩在线免费观看| 欧美丝袜第一区| 2019中文在线观看| 亚洲专区国产精品| 欧美激情视频在线免费观看 欧美视频免费一| 插插插亚洲综合网| 久久亚洲欧美日韩精品专区| 三级精品视频久久久久| 亚洲永久免费观看| 97国产精品人人爽人人做| 亚洲最大成人网色| 国产精品视频专区| 久久久www成人免费精品| 欧美在线观看一区二区三区| 欧美乱大交xxxxx| 国产精品免费网站| 国产精品女人网站| 91亚洲人电影| 久久久免费在线观看| 久久久成人av| 91精品国产沙发| 韩日欧美一区二区| 欧美色道久久88综合亚洲精品| 亚洲国产精品久久| 亚洲免费视频观看| 亚洲精品国产免费| 日本高清+成人网在线观看| 亚洲va男人天堂| 日韩欧美一区二区三区久久| 久久不射热爱视频精品| 亚洲精品在线91| 狠狠躁夜夜躁人人爽天天天天97| 成人精品在线视频| 欧美精品成人91久久久久久久| 国产视频亚洲精品| 久久久久久久久久久久久久久久久久av| 久久国产加勒比精品无码| 欧美大片大片在线播放| 国产精品第三页| 国产精品视频一区二区高潮| 插插插亚洲综合网| 日韩精品福利在线| 九九久久国产精品| 国产精品视频在线观看| 97国产精品人人爽人人做| 97国产精品人人爽人人做| 欧美巨猛xxxx猛交黑人97人| 国产精品美女久久久免费| 日韩女在线观看| 欧美国产在线电影| 国产欧美日韩亚洲精品| 亚洲最大的av网站| 成人a免费视频| 国产日韩精品在线播放| 亚洲一级片在线看| 永久免费毛片在线播放不卡| 一本色道久久综合狠狠躁篇怎么玩| 亚洲图中文字幕| 欧美色播在线播放| 8050国产精品久久久久久| 国产午夜精品理论片a级探花| 色综合久久精品亚洲国产| 国产精品欧美激情在线播放| 亚洲欧美日韩一区在线| 亚洲乱码一区av黑人高潮| 9.1国产丝袜在线观看| 亚洲天堂视频在线观看| 亚洲aⅴ日韩av电影在线观看| 日韩欧美在线视频日韩欧美在线视频| 日韩在线视频二区| 日韩有码在线播放| 欧美疯狂做受xxxx高潮| 国内精品久久久久影院 日本资源| 欧美一级电影久久| 久久最新资源网| 欧美电影在线观看高清| 国产亚洲成精品久久| 亚洲福利视频在线| 国内精品视频在线| 自拍偷拍亚洲区| 91深夜福利视频| 亚洲国模精品一区| 国产精品爱啪在线线免费观看| 免费97视频在线精品国自产拍| 亚洲国产成人精品久久久国产成人一区| 日韩激情av在线播放| 国产视频自拍一区| 激情懂色av一区av二区av| 亚洲欧美日韩久久久久久| 亚洲综合在线中文字幕| 一区二区国产精品视频| 国产在线观看精品一区二区三区| 欧洲s码亚洲m码精品一区| 97精品伊人久久久大香线蕉| 亚洲视频在线看| 国产亚洲精品美女久久久久| 色婷婷久久一区二区| 久久国产视频网站| 色999日韩欧美国产| 在线观看国产精品日韩av| 久久99精品久久久久久青青91| 日本精品视频在线观看| 国产成人精品一区二区在线| 欧美一二三视频| 国产精品久久久久久av福利| 欧美亚洲激情在线| 国产日韩换脸av一区在线观看| 91爱视频在线| 国产精品久久久久久久久借妻| 日韩中文字幕不卡视频| 国产日韩在线亚洲字幕中文| 91性高湖久久久久久久久_久久99| 亚洲欧美制服另类日韩| 欧美国产日本在线| 亚洲精品乱码久久久久久按摩观| 亚洲成人av片| 国产精品mp4| 久热99视频在线观看| 在线a欧美视频| 欧美亚洲国产日本| 亚洲最大在线视频| 91国产视频在线播放| 国产亚洲激情视频在线| 欧美日韩国产成人| 亚洲第一网站免费视频| 亚洲黄页网在线观看| 这里只有精品久久| 精品久久香蕉国产线看观看gif| 亚洲午夜精品久久久久久久久久久久| 国产精品久久久久高潮| 国产视频精品久久久| 91在线观看免费高清完整版在线观看| 日韩精品一区二区视频| 国产成人精品亚洲精品| 欧美精品久久一区二区| 亚洲黄在线观看| 成人免费视频在线观看超级碰| 欧美日韩在线观看视频小说| 亚洲欧美激情视频| 日韩男女性生活视频| 国产精品爽爽爽| 日韩的一区二区| 性欧美xxxx视频在线观看| 久久夜色精品国产欧美乱| 色99之美女主播在线视频| 亚洲成成品网站| 97视频免费观看| 一本一本久久a久久精品综合小说| 精品久久久久久| 亚洲国产美女精品久久久久∴| 欧美亚洲另类视频| 亚洲福利视频二区| 国产精品中文字幕久久久|