所以,我想测试很多条件,对于不同的值...现在只是一堆if,else语句...
但是看起来很难看,我必须有更好的方法......
任何想法?
我想可能有循环但是或者把所有变量都放在一个数组中,但我无法弄清楚如何...
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
}
答案 0 :(得分:1)
使用或||
)运营商利用short circuit evaluation,例如
dataObject["filter[player_id]"] = newState.playerId || this.state.playerId
答案 1 :(得分: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&#34 ; vs" playerId")。
我有三种解决方案:
使用一致的命名惯例
换句话说,您构建的dataObject
具有与state
对象相同的命名模式。
使用辅助功能
使用某种一致的模式转换for循环中的名称,当需要进行这些更改时,该模式会将playerId
更改为player_id
。 (如果您计划使用"过滤","时间"或"页"
使用对象/数组(如在@ ssube'解决方案中)
您还可以使用数组或对象在对象之间转换属性名称。我不会给你一个例子 - @ssube已经这样做了。
答案 2 :(得分: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];
});
瞧,这些字段将通过适当的重命名进行复制。
答案 3 :(得分: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;