用<中的任何方法简化long if else语句在条件?

时间:2014-08-20 09:59:11

标签: javascript

我有以下部分代码,我不太喜欢:

if (a < 2){
    b = 'somethingX';
} else if (a < 4){
    b = 'somethingY';
} else if (a < 6){
    ....;
} else {
    b = 'somethingZ';
}

我有20个if else语句,所有这些语句都包含(a < SomeNumber)个条件。我分配给b的结果可能不是a的函数,而a < someNumber不是常规间隔。我想简化它们,但无法提出足够的解决方案。

如果我有(a === SomeNumber)我可以通过创建一个对象并从该对象访问值(similar to this)轻松地完成此操作,但是这里我有&lt; switch标志。有什么方法吗?

P.S。请不要建议更改此项以切换。我想让它更容易阅读,并根据我的主观意见,阅读if else与{{1}}处于同一水平。

P.S.2 人们问这个逻辑的原因。基本上我有一个瘦客户端,它返回错误消息的代码。他们以某种特定方式分组。例如,从1到8的所有内容都是因为用户存在一些问题。从9到21因为密钥不正确。有时我不需要通知用户确切的消息,因此,由于分组,我可以告诉通用消息。为什么我的服务器没有发送消息?它尽可能地薄,所以发送7比大字符串更好。

2 个答案:

答案 0 :(得分:4)

处理它的最佳方法是使用带有步骤和关联值的数组。您还需要一个默认值:

var default = 'aValue';
var steps   = [2, 'something', 6, 'anotherThing', 8, 'this', 10, 'that', ... ];

然后定义一个使用此数组的函数

function findSmallestMatch(val, default, steps) {
     for (var i=0; i<steps.length; i+=2) if (val<steps[i]) return steps[i+1];
     return default;
}

将其用于:

var res = findSmallestMatch ( 5, default, steps );  // returns 'anotherThing

编辑:    如果你知道你的输入是一个正整数,并且在一个合理的范围内。范围,你可以预先填写 带有值的地图:

var default = 'aValue';
var steps   = [2, 'something', 6, 'anotherThing', 8, 'this', 10, 'that', ... ];
var matchMap = [];
for (var i=0; i<maximumValue; i+=1) 
     matchMap[i] = findSmallestMatch(i, default, steps); 

以后你可以简单地使用:

var res = matchMap[value];

答案 1 :(得分:2)

你可以这样做:

var data = [[2, 'somethingX'], [4, 'somethingY'], ......];
var b = 'somethingZ'; // default value

for (var i=0; i < data.length; i++) {
  if (a < data[i][0]) {
     b = data[i][1];
     break;
  }
}