清洁方式来测试不同值的许多条件?

时间:2015-06-25 14:38:11

标签: javascript

所以,我想测试很多条件,对于不同的值...现在只是一堆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
}

4 个答案:

答案 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")。

我有三种解决方案:

  1. 使用一致的命名惯例
    换句话说,您构建的dataObject具有与state对象相同的命名模式。

  2. 使用辅助功能
    使用某种一致的模式转换for循环中的名称,当需要进行这些更改时,该模式会将playerId更改为player_id。 (如果您计划使用"过滤","时间"或"页"

  3. ,这仍然无效
  4. 使用对象/数组(如在@ 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;