所以我想用这样的switch语句:
switch (scrollLeft) {
case (<1000):
//do stuff
break;
case (>1000 && <2000):
//do stuff
break;
}
现在我知道这些语句(<1000)或(>1000 && <2000)中的任何一个都不会工作(显然是由于不同的原因)。我问的是最有效的方法。我讨厌使用30个if语句,所以我宁愿使用switch语法。我能做些什么吗?
所以我想用这样的switch语句:
switch (scrollLeft) {
case (<1000):
//do stuff
break;
case (>1000 && <2000):
//do stuff
break;
}
现在我知道这些语句(<1000)或(>1000 && <2000)中的任何一个都不会工作(显然是由于不同的原因)。我问的是最有效的方法。我讨厌使用30个if语句,所以我宁愿使用switch语法。我能做些什么吗?
当前回答
您可以使用标准和与标准对应的函数创建一个自定义对象
var rules = [{ lowerLimit: 0, upperLimit: 1000, action: function1 },
{ lowerLimit: 1000, upperLimit: 2000, action: function2 },
{ lowerLimit: 2000, upperLimit: 3000, action: function3 }];
在这些情况下定义函数(定义function1, function2等)
并“评估”规则
function applyRules(scrollLeft)
{
for(var i=0; i>rules.length; i++)
{
var oneRule = rules[i];
if(scrollLeft > oneRule.lowerLimit && scrollLeft < oneRule.upperLimit)
{
oneRule.action();
}
}
}
Note
我讨厌使用30个if语句
很多时候,if语句更容易阅读和维护。 只有当你具备了很多条件,并且在未来有很大增长的可能性时,我才会推荐上面的建议。
更新 正如@Brad在评论中指出的那样,如果条件是互斥的(一次只能有一个条件为真),检查上限就足够了:
if(scrollLeft < oneRule.upperLimit)
假设条件按升序定义(首先是最低的,例如0到1000,然后是1000到2000)
其他回答
switch (Math.floor(scrollLeft/1000)) {
case 0: // (<1000)
//do stuff
break;
case 1: // (>=1000 && <2000)
//do stuff;
break;
}
只有当你有规律的步数时才有效……
编辑:由于这个解决方案不断得到点赞,我必须建议mofolo的解决方案是一个更好的方式
你到底在//做什么?
你可以这样做:
(scrollLeft < 1000) ? //do stuff
: (scrollLeft > 1000 && scrollLeft < 2000) ? //do stuff
: (scrollLeft > 2000) ? //do stuff
: //etc.
我讨厌使用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++});
您可以使用标准和与标准对应的函数创建一个自定义对象
var rules = [{ lowerLimit: 0, upperLimit: 1000, action: function1 },
{ lowerLimit: 1000, upperLimit: 2000, action: function2 },
{ lowerLimit: 2000, upperLimit: 3000, action: function3 }];
在这些情况下定义函数(定义function1, function2等)
并“评估”规则
function applyRules(scrollLeft)
{
for(var i=0; i>rules.length; i++)
{
var oneRule = rules[i];
if(scrollLeft > oneRule.lowerLimit && scrollLeft < oneRule.upperLimit)
{
oneRule.action();
}
}
}
Note
我讨厌使用30个if语句
很多时候,if语句更容易阅读和维护。 只有当你具备了很多条件,并且在未来有很大增长的可能性时,我才会推荐上面的建议。
更新 正如@Brad在评论中指出的那样,如果条件是互斥的(一次只能有一个条件为真),检查上限就足够了:
if(scrollLeft < oneRule.upperLimit)
假设条件按升序定义(首先是最低的,例如0到1000,然后是1000到2000)
在我的例子中(用颜色编码百分比,没有任何性能关键),我很快写下了这样的内容:
function findColor(progress) {
const thresholds = [30, 60];
const colors = ["#90B451", "#F9A92F", "#90B451"];
return colors.find((col, index) => {
return index >= thresholds.length || progress < thresholds[index];
});
}