Javascript 如何优化大量if-else-if-else表达式

Javascript 如何优化大量if-else-if-else表达式,javascript,if-statement,listjs,Javascript,If Statement,Listjs,下面是一些代码示例行 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 >= b

下面是一些代码示例行

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) { 

}
if(loc>0 | | cat>0 | | price>0 | | jsBed=builded){
///条件为checn all true
返回true;
}如果(loc<0 | | cat>0 | | price>0 | | jsBed=BUILD){
///////一个是假的,另一个是真的
}如果(loc>0 | | cat<0 | | price>0 | | jsBed=BUILD){
}
如何处理这些情况。
如果我有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...
}
var numTrue=
(loc>0)+(cat>0)+(价格>0)+(jsBed=BUILD);
开关(numTrue){
案例0:
//如果不满足任何条件,就做些什么
打破
案例1:
//如果满足一个条件,则执行其他操作
打破
//等等。。。
}

由于您的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;
    }
}
if(价格>0 | | jsBed=builded){
var locCheck=(loc>0)?1:0;
var catCheck=(cat>0)?1:0;
开关(locCheck+catCheck){
案例0:
打破
案例1:
打破
案例2:
打破
违约:
打破
}
}
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
(我省略了其他变量…)然后将二进制值相加

const total = locVal + catVal + priceVal
然后您现在必须使用switch 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
}
案例中的值
表示
总计
中存在的二进制序列的整数值。必须注意的是,非常好地记录代码,尤其是case块,这一点非常重要,这样其他读者就可以直接找出哪个值代表什么(就像我所做的那样)


如果每个变量有两个以上的选项,您可以使用10的因子(如在方法foo中,使用
(trueCond?1:0)*Math.pow(10,level)

5条件为2**5,即32个组合

如果要检查各种组合,而无需重复测试,可以对单个结果进行位移位,并将它们组合为switch语句。 直接处理数字简洁,但可读性不强

var loc=1,cat=0,price=0,jsBed=1,卧室=0,jsbuild=0,build=1;
让结果=[loc>0,cat>0,price>0,jsBed=build];

让位=结果。减少((累计、当前、索引)=>accum+(当前您有永远无法满足的条件:

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) { 

}
这个答案假设提供的代码是您试图简化的代码,而不是一般的示例


注意:我想你可能没有写你想做的事情,忘记了一些,而不是OR。

在上面的3个检查中,你重复了最后3个检查,你可以检查它们一次,然后嵌套一个if语句if作为余数。所以你想有一个if-elseif-else分支,包含这些变量的所有可能性吗?
price>0 | jsBed=built
出现重复。不确定是否要检查例如
jsBed>卧室
?是否尝试查找满足的条件总数?(第2和第3个条件应被视为相同)?或者根据满足的条件,您是否有不同的实现?根据注释,您希望使用和
&&
,或者
|
(loc>0)?1:0
可以替换为
+(loc>0)
。此外,由于OP有多个OR条件,即使最后3个条件为false,也必须执行代码。您的代码将不起作用。这与OP的代码不相等。如果
price>0 | | jsBed=build
false
,当
loc
cat
为正数时,则根本不会执行代码。而在OP的代码中首先,如果执行
语句体,则执行
。嗯,您是对的@Tushar。调整它将导致类似于Mureinik
案例1
的结果,需要在其中添加一个附加条件,以确定
loc
cat
>0
。或者,您可以为
locCheck使用不同的值e> 和
catCheck
。例如,1和2会根据实际情况为您提供0、1、2和3。这看起来很合理。我正在考虑这一点。谢谢@Mureinik@MArfan根据给定的信息,这是最好的解决方案之一,但如果有任何其他组合,请将它们添加到问题中。可能有其他方法可以提供帮助。因此loc=0,cat=1是一种解决方案ted为loc=1,cat=0。这并不能解决OP的示例。它只检查满足条件的总数。实际上,我可能错了,这可能是OP所寻找的,尽管它没有明确说明。如果您希望能够检查特定条件,只需将测试移动一个递增的值,例如:
var numTrue=(loc>0)+((cat>0)0)这不是一个Java问题。这是我读过这个问题后的想法,“这是很多无用的检查。”@我感谢你的努力。我只想在我的条件匹配的情况下返回true。一旦匹配,它就不会前进。因为我们知道在JavaScript中,一旦返回true或false。谢谢。我认为这将减少检查。条件保持不变。
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
}
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) { 

}
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) { 

}