Javascript 使用<;简化长if-else语句的任何方法;情况如何?

Javascript 使用<;简化长if-else语句的任何方法;情况如何?,javascript,Javascript,我有以下代码部分,我并不喜欢: if (a < 2){ b = 'somethingX'; } else if (a < 4){ b = 'somethingY'; } else if (a < 6){ ....; } else { b = 'somethingZ'; } if(a

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

if (a < 2){
    b = 'somethingX';
} else if (a < 4){
    b = 'somethingY';
} else if (a < 6){
    ....;
} else {
    b = 'somethingZ';
}
if(a<2){
b='somethingX';
}否则如果(a<4){
b=‘某物’;
}否则,如果(a<6){
....;
}否则{
b='somethingZ';
}
我有大约20个这样的if-else语句,它们都由
(a
条件组成。结果我分配给
b
的can不是
a
的函数,
a
不在规则间隔内。我想把它们简化,但却不能提出一个适当的解决办法

如果我有
(a==SomeNumber)
我可以通过创建一个对象和访问这个对象(某物)的值来轻松地完成这项工作,但这里我有 p.S.请不要建议将此更改为开关。我想让它更容易阅读,根据我的主观意见,阅读
开关
if else
处于同一水平


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

您可以这样做:

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;
  }
}
var数据=[[2',somethingX'],[4',somethingY'],…];
变量b='somethingZ';//默认值
对于(变量i=0;i
您可以这样做:

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;
  }
}
var数据=[[2',somethingX'],[4',somethingY'],…];
变量b='somethingZ';//默认值
对于(变量i=0;i
处理它的最佳方法是使用带有步骤和关联值的数组。您还需要一个默认值:

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 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 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 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); 

如果你有20条这样的语句,你可能需要使用
开关
。@indieblue谢谢你的评论。它提醒我,我忘了写我不想使用switch(我更新了我的问题)switch在我看来更容易阅读。@BOSS这正是我添加这个词的原因subjective@SalvadorDali:我明白了。对于该用例,一个(JSON?)配置对象将ID映射到消息和/或类别,类似于GameAlchemation提出的方法,似乎是一种可行的方法。顺便说一句,“瘦客户机”通常指的是精简逻辑(和繁重的数据传输),而不是精简带宽:-)如果您有20条这样的语句,您可能需要使用
switch
。@indieblue感谢您的评论。它提醒我,我忘了写我不想使用switch(我更新了我的问题)switch在我看来更容易阅读。@BOSS这正是我添加这个词的原因subjective@SalvadorDali:我明白了。对于该用例,一个(JSON?)配置对象将ID映射到消息和/或类别,类似于GameAlchemation提出的方法,似乎是一种可行的方法。顺便说一句,“瘦客户端”通常指的是精简逻辑(和繁重的数据传输),而不是精简带宽:-)+1。您也可以考虑在数组上使用二进制搜索来提高性能(这将与IF语句相当丑陋)。@贝尔吉:我认为任何编译语言中的二进制搜索都是正确的。但是分支成本在JavaScript中是如此之高,它很可能会加速搜索一个像O.P.的小数组(限制为1)的事情。你也可以考虑在数组上使用二进制搜索来提高性能(这与IF语句相当丑陋)。@Bergi:我认为你对任何编译语言的二进制搜索都是正确的,但是Javascript的分支成本太高了,很可能会降低搜索像O.P.这样的小数组的速度(限制?