2017-05-31 155 views
10

这里是代码的一些样品线..如何优化大量的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个组合,它会去更多的代码行我们有更好的选择来检查所有的条件。

+5

从上面的3你重复最后3次检查,你可以检查一次,并嵌套if语句,如果余下的话。 –

+0

所以你想要有一个if-elseif-else分支以及这些变量的所有可能性? '价格> 0 || jsBed <=卧室|| jsBuilt> = built'似乎重复。不确定是否要检查例如'jsBed>卧室'? – KarelG

+1

你是否想要找到符合条件的总数? (第二和第三条件应该被视为相同)?或者你有不同的实现取决于满足哪种条件? –

回答

12

如果你把一个布尔表达式,如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... 
} 
+1

这看起来很合理..我正在考虑它..谢谢@Mureinik –

+0

@MArfan根据给定的信息,这是一个最好的解决方案,但如果还有其他组合,请将它们添加到问题中。可以有其他方法可以帮助。 – Rajesh

+6

因此,loc = 0,cat = 1被视为loc = 1,cat = 0。这并不解决OP的例子。它只检查符合条件的总数。 –

0

由于您的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; 
    } 
} 
+0

'(loc> 0)? 1:0'可以替换为'+(loc> 0)'。同样,由于OP有多个OR条件,即使最后3个条件为假,代码也必须执行。您的代码将无效 – Rajesh

+0

我不理解它。试图了解.. –

+0

这不等同于OP的代码。如果'价格> 0 || jsBed <=卧室||当'loc'&'cat'是正数时,jsBuilt> = built'就是'false',代码根本不会执行。在OP代码中,首先执行if语句体。 – Tushar

1

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)

+3

这不是Java的问题。 – user694733

2

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帮助

4

你必须条件,将永远不会得到满足:

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。

+1

这就是我在阅读问题后想到的:“这是很多无用的检查。” – Kevin

+0

@Walfrat。我感谢你的努力。只有当我的条件匹配时,我才想返回true。一旦匹配它就不会前进。因为我们知道在JavaScript中一旦返回true或false。谢谢 –

+0

我认为这会减少检查。并保持原样。 –