作為搬磚在第一線的底層工人,業務場景從來是沒有做不到只有想不到的複雜。
不過他強任他強,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...