我有以下部分代码,我不太喜欢:
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比大字符串更好。
答案 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;
}
}