2015-06-25 69 views
0

所以,我想測試許多條件,對於不同的值...現在只是一堆if,else語句...乾淨的方式來測試不同值的許多條件?

但它看起來醜陋im確定必須有更好的方法...

有什麼想法?

林想也許有循環,但還是把所有增值經銷商在一個數組,但我找不出如何..

THX!

var dataObject = {} 

if (newState.playerId){ 
    dataObject["filter[player_id]"] = newState.playerId 
}else{ 
    dataObject["filter[player_id]"] = this.state.playerId 
} 

if (newState.pageLimit){ 
    dataObject ["page[limit]"] = newState.pageLimit 
}else{ 
    dataObject["page[limit]"] = this.state.pageLimit 
} 

if (newState.timeFrom){ 
    dataObject["time[from]"] = newState.timeFrom 
}else{ 
    dataObject["time[from]"] = this.state.timeFrom 
} 

if (newState.timeTo){ 
    dataObject["time[to]"] = newState.timeTo 
}else{ 
    dataObject["time[to]"] = this.state.timeTo 
} 

if (newState.gameId){ 
    dataObject["filter[game_id]"] = newState.gameId 
}else{ 
    dataObject["filter[game_id]"] = this.state.gameId 
} 

if (newState.customerId){ 
    dataObject["filter[customer_id]"] = newState.customerId 
}else{ 
    dataObject["filter[customer_id]"] = this.state.customerId 
} 

if (newState.currency){ 
    dataObject["filter[currency]"] = newState.currency 
}else{ 
    dataObject["filter[currency]"] = this.state.currency 
} 

if (newState.variant){ 
    dataObject["filter[locale]"] = newState.locale 
}else{ 
    dataObject["filter[locale]"] = this.state.locale 
} 

if (newState.variant){ 
    dataObject["filter[demo]"] = newState.demo 
}else{ 
    dataObject["filter[demo]"] = this.state.demo 
} 
+1

在屬性上使用循環!你能告訴我們'newState'和'this.state'的定義嗎? – Bergi

+0

基於'newState.variant'的if-else的最後兩個塊?或'locale'和'demo'狀態分別? – light

+0

@GiorgioMartini你解決了嗎? – fcalderan

回答

0

減少你的病情

首先,你可以使用JavaScript的||運營商和變化:

if (newState.playerId){ 
    dataObject["filter[player_id]"] = newState.playerId 
}else{ 
    dataObject["filter[player_id]"] = this.state.playerId 
} 

要大大降低的:

dataObject["filter[player_id]"] = newState.playerId || this.state.playerId; 

乾涸代碼

您可以使用屬性數組:

var propertyList = ["playerId", "pageLimit", "timeFrom" /* etc. */] 

因爲對象的屬性可以用方括號就可以通過他們循環像這樣被引用:

propertyList.forEach(function(property){ 
    dataObject[property] = newState[property] || this.state[property] 
}); 

免責聲明:該解決方案完全沒有考慮到考慮你的嵌入式對象(如「過濾器」)和你的命名方案中的細微變化(如「player_id」vs「playerId」)。

三種解決方案發生對我說:

  1. 使用一致的命名約定
    換句話說在你建立具有相同的命名模式爲您state對象dataObject

  2. 使用輔助函數
    轉換的名稱,請使用某種改變playerIdplayer_id當這些種類的更改需要進行統一的模式的循環。 (如果您打算使用「過濾器」,「時間」或「網頁」,這將仍然無法正常工作。

  3. 使用對象/陣列(如@ ssube的解決方案)
    你也可以使用數組或目標對象之間進行轉換的屬性名,我不會給你一個例子 - @ssube也這樣做的話

+1

不幸的是,並非所有目標字段都是過濾器。我無法在'dataObject'上找到一致的命名約定,所以我認爲每個屬性都需要兩個名稱。 – ssube

+0

真的沒有意識到他們都是裝修工,但我意識到,儘管如此,名稱還是有細微差別的。儘管使用一致的命名約定更合理(如果可能的話)。 – jcuenod

1

使用的short circuit evaluation,例如或(||)運營商採取的好處。

dataObject["filter[player_id]"] = newState.playerId || this.state.playerId 
0

你有一個循環模式在這裏:

if (newState[srcField]) { 
    dataObject[destField] = newState[srcField] 
} else { 
    dataObject[destField] = this.state[srcField] 
} 

由於JS」處理的OR操作,可以簡化到:

dataObject[destField] = newState[srcField] || this.state[srcField]; 

既然你的字段名,你可以設置一個循環:

var dataObject = {}; 
var fields = [ 
    ['playerId', 'filter[player_id]'], 
    ['pageLimit', 'page[limit]'] 
]; 

fields.forEach(function (field) { 
    var src = field[0], dest = field[1]; 
    dataObject[dest] = newState[src] || this.state[src]; 
}); 

和瞧,字段將被複制到適當的重命名。

0
var dataObject = {}; 
dataObject['filter[player_id]'] = newState.playerId || this.state.playerId; 
dataObject['filter[game_id]'] = newState.gameId || this.state.gameId; 
dataObject['filter[customer_id]'] = newState.customerId || this.state.customerId; 
dataObject['filter[currency]'] = newState.currency || this.state.currency; 
dataObject['filter[locale]'] = newState.variant ? newState.locale : this.state.locale; 
dataObject['filter[demo]'] = newState.variant ? newState.demo: this.state.demo; 
dataObject['page[limit]'] = newState.pageLimit || this.state.pageLimit; 
dataObject['time[from]'] = newState.timeFrom || this.state.timeFrom; 
dataObject['time[to]'] = newState.timeTo || this.state.timeTo; 
相關問題