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)
我可以通过创建一个对象和访问这个对象(某物)的值来轻松地完成这项工作,但这里我有开关
与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.这样的小数组的速度(限制?