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

flmtquvp  于 2023-02-28  发布在  Java
关注(0)|答案(5)|浏览(204)

下面是一些示例代码行。

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个组合它去更多的代码行我们有没有更好的选择来检查所有的条件。

bejyjqdl

bejyjqdl1#

如果你在javascript中把一个布尔表达式当作一个整数来处理,那么它的值会是0(对于false)或者1(对于true),所以你可以把这些条件加起来,然后用一个大小写转换结构来检查有多少个条件是真的:

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...
}
k75qkfdt

k75qkfdt2#

你有一个永远不会满足的条件:

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

}

基本上:

  • 在第二个else if中,条件cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built是无用的,因为在第一个条件中已经满足了,因为你使用了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。

a2mppw5e

a2mppw5e3#

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

你可以用常量来帮助

vlju58qv

vlju58qv4#

  • 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

然后,您现在必须使用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中的值表示total中存在的二进制序列的整数值,必须注意的是,非常好地记录代码是极其重要的,特别是case块,以便其他读者可以直接找出哪个值代表什么(就像我所做的那样)。
如果每个变量有两个以上的选项,则可以使用因子10(如在方法foo中,使用(trueCond ? 1 : 0) * Math.pow(10, level)

e0uiprwp

e0uiprwp5#

由于你的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;
    }
}

相关问题