其實我們可以少寫點if else和switch

2021-09-11 13:56:29 字數 2919 閱讀 5752

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

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

假設有這麼個場景,不同情況下列印不同值。 因為涉及到的條件太多,就不提三目運算之類優化了。

if (a == 1)  else

if (a == 2) else

if (a == 3) else

if (a == 4)

/* n..... */

複製**

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

每動一下就戰戰兢兢,誰知道**會遺漏。 那麼換種方式呢

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

switch(a)

複製**

定義乙個object作為配置物件來存放不同狀態,通過鍊錶查詢

const statusmap = ,

2:()=>

/* n.... */

}// 執行

let a = 1

statusmap[a || 1]()

複製**

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

當然在某些狀態下可以使用陣列,來做這個配置物件。

// 這裡就涉及其他優化了,例如將執行函式抽離出來,大家不要關注func的內容就好。

// 它就是個function,內容很複雜

const statusarr = [function(),

function () ,]

// 執行

let a = 1

statusarr[a || 1]()

複製**

陣列的要求更高一點,如果是其他key,例如字串,那麼陣列就不能滿足需求了

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

前面是每種處理方式都不同,下面有幾種情況下處理函式相同的, 例如1-39的時候,呼叫a,40之後呼叫b,如果我們繼續來用對映的方式來處理。

function

f1 ()

function

f2 ()

const statusmap=

let a = 2

statusmap[a]()

複製**

這樣當然也可以,不過重複寫那麼多f1,**看起來不夠簡潔。

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

也就是說我們的鍵值不是字串而是個陣列,object顯然只支援字串, 那麼可以將這麼多key合併成乙個:'1,2,3,4,..,9'。

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

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

// 將鍵值key設定為乙個拼接之後的字串

const statusmap =

// 獲取所有的鍵值,待會遍歷用

const keys = object.keys(statusmap),

len = keys.length

// 遍歷獲取對應的值

const getval=(param=''

)=>

}}let a = 2,

handle = getval(a)

handle() // 1

複製**

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

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 = ''

) => }}

const a = 2

getval(a)

handle()

複製**

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

肯定有部分人就是不想做遍歷的操作,既然乙個陣列不能滿足,那麼兩個陣列呢。

// 鍵值陣列和value 保持對應關係

const keyarr = ['1,2,3,4,5','40']

const valarr = [f1,f2]

const getval = (param = ''

)=>)

// 獲取對應值

return valarr[index]

}let a = 2,

handle = getval(a)

handle()

複製**

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

這裡一直沒有達到我最初的目的,即鍵裡面重複的陣列,可以不通過多餘操作匹配到,上面不管怎麼樣都進行了處理,這不是懶人的想要的。

其實我們都可以變得更加優秀!

大家 好,又到了和大家聊天的時候了,今天我主要任務是和大家聊聊我今天面試的經歷,真可謂一波三折啊!今天本來想去看看我弟弟和我同學的,恰好同學說要去面試德邦物流,硬是拉著我一起去參加!來到現場,德邦公司的負責人給我們進行了一次宣講會,聽了差不多乙個鐘頭,重點介紹該公司的總裁怎麼起家的,公司的待遇其他的...

大學生,其實我們可以晚點再戀愛

其實,我們可以晚點再戀愛。這篇文章之前在空間看到很多次了,之前,沒有經歷,以為這是完全是在扯淡,現在分手了,尤記得當年的海誓山盟,現在想來卻是青春的懵懂與稚嫩,頓覺得此文說得好有道理。如果遇到乙個你深愛的女孩,而你感覺她也喜歡你,大部分的人都是直接就交往了。這樣做的後果就是,最後失去了乙個你深愛的人...

其實你可以不必Redis exists

今天,不小心看到一段 因之前優化過類似的問題。但是這種問題一而再再而三出現,真心覺得碼農,也不是誰都能當好的。細節決定成敗,做事情的風格,真真的會阻礙乙個人的發展。廢話不多說,直接上 不友好使用方式 if jedis.exists key else 友好使用方式 string value jedis...