Switch大于/小于语句
Switch statement for greater-than/less-than
所以我想使用这样的开关语句:
switch (scrollLeft) {
case (<1000):
//do stuff
break;
case (>1000 && <2000):
//do stuff
break;
}
现在我知道这些语句(<1000
)或(>1000 && <2000
)中的任何一个都不起作用(显然出于不同的原因)。我问的是最有效的方法。我讨厌使用30个if
语句,所以我宁愿使用开关语法。有什么我能做的吗?
当我查看其他答案中的解决方案时,我发现了一些我知道对性能不利的东西。我本来打算把它们放在评论里,但我认为最好是对其进行基准测试并分享结果。你可以自己测试一下。下面是我的结果(ymmv)标准化后的最快的操作在每个浏览器
这是2021-MAY-05的结果
的另一种选择:
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();
}
}
}
注意
很多时候,if语句更容易阅读和维护。只有当你有很多条件和在未来有很多增长的可能性时,我才会推荐上述方法。我讨厌使用30个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++});
- 可以't让我的if语句处理js中的html表单输入
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 自动修复”;语句前缺少分号“;
- 如何在 API 调用后和 if 语句中启用提交按钮
- 是“;x==a||b”;以及“;x==a||x==b”;JavaScript中的等效语句
- 带有多个elseif的Javascript if语句
- 这个条件语句的逻辑有问题
- Sharepoint JScript if语句未执行
- 为什么继续;语句冻结浏览器
- Javascript:If-then语句在函数中不起作用
- SharePoint 2010 Jquery/JSON Rest Multiple OR语句-如何
- for循环中的javascript if语句找不到==
- 当使用extern和目标JavaScript时,我如何强制Haxe编译器使用require语句
- jquery if语句返回return wong语句
- 函数在return语句之前返回空对象
- 在if语句下的html中使用javascript变量
- I'm在if语句中使用小于比较器;然而,即使它不应该;t、 它的评估结果为false
- Javascript if语句小于'x'数组中的对象don'
- Switch大于/小于语句
- 对相同'小于'的JavaScript if语句进行分组