平時在書寫if/else if/else 條件判斷,當邏輯複雜時,寫完有種半死不活的感覺,也提現不了代碼水平,那麼,有什麼好方法來將他更優雅的表現呢?
下面來看個例子
const clickEvent = (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對象進行查找並執行,這種寫法在多元條件判斷時候簡直爽歪歪…。
如果有些同學覺得把查詢條件拼成字符串有點彆扭,那還有一種方案,就是用Map對象,這裏來介紹下ES6中新增的數據結構Map:
Map結構提供了“值—值”的對應,是一種更完善的Hash結構實現。如果你需要“鍵值對”的數據結構,Map比Object更合適。它類似於對象,也是鍵值對的集合,但是“鍵”的範圍不限於字符串,各種類型的值(包括對象)都可以當作鍵,以Object對象的形式作爲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))
}
看了以上書寫是不是優雅很多…