【问题标题】:Any way to simplify long if else statement with < in conditions?有什么方法可以简化带有 < in 条件的 long if else 语句?
【发布时间】:2014-08-20 09:59:11
【问题描述】:

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

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

我有大约 20 个这样的 if else 语句,它们都由(a &lt; SomeNumber) 条件组成。结果我分配给b can 不是a 的函数,并且a &lt; someNumber 不是定期间隔。我想简化它们,但无法提出适当的解决方案。

如果我有(a === SomeNumber),我可以通过创建一个对象并访问该对象的值(similar to this)轻松地做到这一点,但这里我有

P.S.请不要建议将其更改为 switch。我想让它更易于阅读,根据我的主观意见阅读switchif else 处于同一水平。

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

【问题讨论】:

  • 如果你有 20 个这样的语句,你可能想使用switch
  • @indieblue 谢谢你的评论。它提醒我我忘了写我不想使用开关(我更新了我的问题)
  • switch 更容易阅读 IMO。
  • @BOSS 这正是我添加主观这个词的原因
  • @SalvadorDali:我明白了。对于那个用例,一个(JSON?)配置对象将 ids 映射到消息和/或类别,类似于 GameAlchemist 提出的,似乎是要走的路。顺便说一句,“瘦客户端”通常指的是瘦逻辑(和大量数据传输),而不是瘦带宽:-)

标签: javascript


【解决方案1】:

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

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。您还可以考虑在数组上使用二进制搜索来提高性能(如果使用 if 语句,这将非常难看)。
  • @Bergi :我认为您对任何编译语言中的二进制搜索都是正确的,但是 Javascript 中的分支成本非常高,以至于它很可能会加快 down 的速度搜索像 O.P.'s (limit ?
【解决方案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;
  }
}

【讨论】:

    猜你喜欢
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多