2015-06-25 104 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; 
相关问题