Switch大于/小于语句

Switch statement for greater-than/less-than

本文关键字:语句 小于 大于 Switch      更新时间:2023-09-26

所以我想使用这样的开关语句:

switch (scrollLeft) {
  case (<1000):
   //do stuff
   break;
  case (>1000 && <2000):
   //do stuff
   break;
}

现在我知道这些语句(<1000)或(>1000 && <2000)中的任何一个都不起作用(显然出于不同的原因)。我问的是最有效的方法。我讨厌使用30个if语句,所以我宁愿使用开关语法。有什么我能做的吗?

当我查看其他答案中的解决方案时,我发现了一些我知道对性能不利的东西。我本来打算把它们放在评论里,但我认为最好是对其进行基准测试并分享结果。你可以自己测试一下。下面是我的结果(ymmv)标准化后的最快的操作在每个浏览器

这是2021-MAY-05的结果

<表类> 测试>节点 tbody> <<tr>1.0 15道明> 14道明> 17道明> 17道明> 16道明> 14道明> tr>眼前的道明> .001.001.001.001.001.00虽然是间接的道明> 1.212.182.19 switch-immediate td> 1.432.19量程切换td> 2.00 switch-range2 td> 1.36 switch-indirect-array td> 2.752.50 array-linear-switch td> 2.122.122.50 array-binary-switch td> 6.075.245.24tbody>

的另一种选择:

var scrollleft = 1000;
switch (true)
{
    case (scrollleft > 1000):
      alert('gt');
      break;
    case (scrollleft <= 1000):
      alert('lt');
      break; 
}

演示:http://jsfiddle.net/UWYzr/

switch (Math.floor(scrollLeft/1000)) {
  case 0: // (<1000)
   //do stuff
   break;
  case 1: // (>=1000 && <2000)
   //do stuff;
   break;
}

仅适用于有规律的步骤…

编辑:由于这个解决方案不断得到好评,我必须建议mofolo的解决方案是一种更好的方式

你可以创建一个自定义对象与标准和对应的函数

var rules = [{ lowerLimit: 0,    upperLimit: 1000, action: function1 }, 
             { lowerLimit: 1000, upperLimit: 2000, action: function2 }, 
             { lowerLimit: 2000, upperLimit: 3000, action: function3 }];

在这些情况下定义你想要做的函数(定义function1, function2等)

和"evaluate"规则

function applyRules(scrollLeft)
{
   for(var i=0; i>rules.length; i++)
   {
       var oneRule = rules[i];
       if(scrollLeft > oneRule.lowerLimit && scrollLeft < oneRule.upperLimit)
       {
          oneRule.action();
       }
   }
}

注意

我讨厌使用30个if语句

很多时候,if语句更容易阅读和维护。只有当你有很多条件在未来有很多增长的可能性时,我才会推荐上述方法。

更新
正如@Brad在评论中指出的那样,如果条件是互斥的(一次只能有一个条件为真),检查上限应该足够了:

if(scrollLeft < oneRule.upperLimit)

假设条件按升序定义(例如,先最低的是0 to 1000,然后是1000 to 2000)

你到底在//do stuff做什么?

你可以这样做:

(scrollLeft < 1000) ? //do stuff
: (scrollLeft > 1000 && scrollLeft < 2000) ? //do stuff
: (scrollLeft > 2000) ? //do stuff
: //etc. 

这是另一个选项:

     switch (true) {
         case (value > 100):
             //do stuff
             break;
         case (value <= 100)&&(value > 75):
             //do stuff
             break;
         case (value < 50):
            //do stuff
             break;
     }

未经测试,不确定这是否会工作,但为什么不做一些if statements之前,为switch statement设置变量。

var small, big;
if(scrollLeft < 1000){
    //add some token to the page
    //call it small
}

switch (//reference token/) {
  case (small):
   //do stuff
   break;
  case (big):
   //do stuff;
   break;
}

更新接受的答案(暂不能评论)。截至2016年12月1日,在chrome中使用演示jsfiddle, switch-immediate是最快的解决方案。

结果:时间分辨率:1.33

   25ms "if-immediate" 150878146 
   29ms "if-indirect" 150878146
   24ms "switch-immediate" 150878146
   128ms "switch-range" 150878146
   45ms "switch-range2" 150878146
   47ms "switch-indirect-array" 150878146
   43ms "array-linear-switch" 150878146
   72ms "array-binary-switch" 150878146

完成
 1.04 (   25ms) if-immediate
 1.21 (   29ms) if-indirect
 1.00 (   24ms) switch-immediate
 5.33 (  128ms) switch-range
 1.88 (   45ms) switch-range2
 1.96 (   47ms) switch-indirect-array
 1.79 (   43ms) array-linear-switch
 3.00 (   72ms) array-binary-switch

在我的例子中(用颜色标记百分比,不涉及性能问题),我很快写了如下内容:

function findColor(progress) {
    const thresholds = [30, 60];
    const colors = ["#90B451", "#F9A92F", "#90B451"];
    return colors.find((col, index) => {
        return index >= thresholds.length || progress < thresholds[index];
    });
}

我讨厌使用30个if语句

我最近遇到了同样的情况,我就是这样解决的:

:

if(wind_speed >= 18) {
    scale = 5;
} else if(wind_speed >= 12) {
    scale = 4;
} else if(wind_speed >= 9) {
    scale = 3;
} else if(wind_speed >= 6) {
    scale = 2;
} else if(wind_speed >= 4) {
    scale = 1;
}

:

var scales = [[4, 1], [6, 2], [9, 3], [12, 4], [18, 5]];
scales.forEach(function(el){if(wind_speed > el[0]) scale = el[1]});

如果你设置" 1,2,3,4,5 "那么它可以更简单:

var scales = [4, 6, 9, 12, 18];
scales.forEach(function(el){if(wind_speed >= el) scale++});