我有一个对象,我必须使用多个if-else语句验证不同的值,如下面的示例javascript片段:
if(properties.values.a > 0 ){
}else if(properties.values.b > 0){
}else if(properties.values.c > 0){
}else if(properties.values.d > 0){
}else if(properties.values.e > 0){
}else{
}
我愿意将这个多个if-else语句替换为switch-case。现在我想知道对象是否可能?如果可能的话,应该怎么做呢?
答案 0 :(得分:2)
Switch不应该像这样工作。所以,不,这是不受支持的。 作为解决方法,您可以这样做
switch (true) {
case (properties.values.a > 0):
...
case (properties.values.b > 0):
...
case (properties.values.c > 0):
...
case (properties.values.d > 0):
...
case (properties.values.e > 0):
...
}
仍然,非常难看所以我建议你坚持if / else。
答案 1 :(得分:1)
您可以使用for in
循环执行此操作:
o = {
a:0,
b:0,
c:1,
d:0
};
for(var p in o) {
if (o[p] > 0) {
//...
console.log(o[p]);
break;
}
}

答案 2 :(得分:1)
如果找到值,您可以使用带有所需键的数组,并使用带有短路的迭代。
如果找不到任何人,请致电callOther
。
['a', 'b', 'c', 'd', 'e'].some(k => {
if (properties.values[k] > 0) {
callThis();
return true;
}
}) || callOther();
答案 3 :(得分:1)
在JavaScript中,您只能使用switch
来检查是否相等。您无法使用开关检查a > b
是否正确。
如果你想要一个更优雅的解决方案,我特别只会在需要检查大量规则时使用,就是做这样的事情:
const checkers = [];
checkers.push([p => p.values.a > 0, () => { /* do something */ }])
checkers.push([p => p.values.b > 0, () => { /* do something */ }])
...
checkers.filter(checker => checker[0](property)).forEach(checker => checker[1]())
在上面的例子中,checkers是一个数组数组,其中第一个元素是谓词函数,第二个元素是谓词为true时应该执行的函数。
但是再次......对于大多数情况,你只需按照你的描述做if/else
。
另外,如果你想检查一个值是否大于0,你可能只使用if(a)
,因为如果a
不是0
,那么它是真的,否则就是假的
修改强>
显然,从技术上讲,你可以在switch
语句中使用逻辑表达式,即使它看起来像hacky = /