如何优化大量的if-else if-else语句表达
这里是代码的一些样品线..如何优化大量的if-else if-else语句表达
if(loc > 0 || cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built) {
/// Condition to checn all true
return true;
} else if(loc < 0 || cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built) {
/////// 1 false other are true
} else if(loc > 0 || cat < 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built) {
}
如何处理这些情况。 如果我有5个声明。那么它一定是几乎12 +条件一个接一个..如果我检查所有的5个组合,它会去更多的代码行我们有更好的选择来检查所有的条件。
如果你把一个布尔表达式,如JavaScript的一个整数,它会评估为0
(为false
)或1
(用于true
)。所以,你可以总结的条件,然后使用switch-case结构来检查有多少是真实的:
var numTrue =
(loc > 0) + (cat > 0) + (price > 0) + (jsBed <= bedroom) + (jsBuilt >= built);
switch(numTrue) {
case 0:
// do something if no condition is met
break;
case 1:
// do something else if one condition is met
break;
// etc...
}
这看起来很合理..我正在考虑它..谢谢@Mureinik –
@MArfan根据给定的信息,这是一个最好的解决方案,但如果还有其他组合,请将它们添加到问题中。可以有其他方法可以帮助。 – Rajesh
因此,loc = 0,cat = 1被视为loc = 1,cat = 0。这并不解决OP的例子。它只检查符合条件的总数。 –
由于您的3个条件是固定的,你可以先有他们,其次是他人,这可以转换成切换情况。
if(price > 0 || jsBed <= bedroom || jsBuilt >= built) {
var locCheck = (loc > 0) ? 1 : 0;
var catCheck = (cat > 0) ? 1 : 0;
switch(locCheck + catCheck){
case 0:
break;
case 1:
break;
case 2:
break;
default:
break;
}
}
edit1:修改为javascript,而不是java。糟糕...
我不确定您是否想查看所有组合,但可以通过为每个可能的输出引入一个数值来对它们进行分组。
具体而言,每个变量有5个变量和2个选项?我用二进制表示设置了一个包含数字的表格。如果每个(或某个)变量都有2个选项,则必须使用数字(基数10)。您可以使用二进制值像
const locVal = (loc > 0 ? 0x1 : 0x0) << 0;
const catVal = (cat < 0 ? 0x1 : 0x0) << 1;
const priceVal= (price < 0 ? 0x1 : 0x0) << 2;
ect
所以,你可以将它们的方法:
function foo(trueCond, level) {
return (trueCond ? 0b1 : 0b0) << level;
}
这使得
const locVal = foo(loc > 0, 0);
const catVal = foo(cat > 0, 1);
const priceVal= foo(price > 0, 2)
(我省略了其他瓦尔...)然后加起来的二进制值
const total = locVal + catVal + priceVal
然后,你现在在case
使用开关case语句等
switch (total) {
case 0: // all options negative
case 1: // only loc is positive
case 2: // only cat is positive
case 3: // both loc and cat is positive
ect
}
的值表示存在于total
二进制序列的整数值。需要注意的是,对于文档代码非常好,特别是大小写块,这样其他读者可以直接计算出哪个值代表什么(就像我做过的那样),这一点非常重要。
如果每个可变多于两个选项中,可以在10因子工作(如在方法FOO中,使用(trueCond ? 1 : 0) * Math.pow(10, level)
)
这不是Java的问题。 – user694733
5个条件是2 ** 5,即32种组合。
如果您想要检查各种组合,而无需重复测试,则可以对各个结果进行位移,并将它们组合在一起以作为switch语句。 与数字直接合作简洁,但不是很可读
var loc=1,cat=0,price=0,jsBed=1,bedroom=0,jsbuilt=0,built=1;
let results=[loc > 0,cat > 0,price > 0,jsBed <= bedroom,jsbuilt >= built];
let bits=results.reduce((accum,current,index)=>accum+(current<<index), 0);
switch(bits){
case 0: // none
break;
case 3: // first two
break;
case 4: // third one
break;
}
修改此使用常量会使switch语句更易读
var loc=0,cat=1,price=0,jsBed=1,bedroom=0,jsbuilt=0,built=1;
const locBit=1<<0;
const catBit=1<<1;
const priceBit=1<<2;
const bedBit=1<<3;
const builtBit=1<<4;
let bits=(loc > 0)*locBit |
(cat > 0)*catBit |
(price > 0)*priceBit |
(jsBed <= bedroom)*bedBit |
(jsbuilt >= built)*builtBit;
switch(bits){
case 0:
console.log("!loc,!cat,!price,!bed,!built");
break;
case catBit|locBit:
console.log("loc,cat,!price,!bed>!built");
break;
default:
console.log(bits);
}
你可以使用con stants帮助
你必须条件,将永远不会得到满足:
if(loc > 0 || cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built){
/// Condition to checn all true
return true;
} else if(loc < 0 || cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built) {
/////// 1 false other are true
} else if(loc > 0 || cat < 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built) {
}
基本上是:
- 在第二否则如果,条件
cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built
是第一个已经见过没用ebcause。由于您使用的是else if
,因此他们已经输入了第一个if。所以唯一重要的是loc < 0
。 - 同上
elseif
只有cat < 0
是相关的。
所以可以重写,以
if(loc > 0 || cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built){
/// Condition to checn all true
return true;
} else if(loc < 0) {
/////// 1 false other are true
} else if(cat < 0) {
}
这个回答假设提供的代码是你试图简化一个,而不是一个通用的样品。
注意:我想你可能没有写你想做的事,忘了一些AND而不是OR。
这就是我在阅读问题后想到的:“这是很多无用的检查。” – Kevin
@Walfrat。我感谢你的努力。只有当我的条件匹配时,我才想返回true。一旦匹配它就不会前进。因为我们知道在JavaScript中一旦返回true或false。谢谢 –
我认为这会减少检查。并保持原样。 –
从上面的3你重复最后3次检查,你可以检查一次,并嵌套if语句,如果余下的话。 –
所以你想要有一个if-elseif-else分支以及这些变量的所有可能性? '价格> 0 || jsBed = built'似乎重复。不确定是否要检查例如'jsBed>卧室'? – KarelG
你是否想要找到符合条件的总数? (第二和第三条件应该被视为相同)?或者你有不同的实现取决于满足哪种条件? –