Как оптимизировать большое количество выражений 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 ответов


если вы рассматриваете логическое выражение как целое число в 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...
}

у вас есть условие, которое никогда не будет выполнено :

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

}

этот ответ предположим, что предоставленный код является тем, который вы пытаетесь упростить, а не общим образцом.

примечание: Я думаю, вы, возможно, не написали, что вы хотели сделать, забыв некоторые и вместо или.


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

вы можете использовать константы, чтобы помочь


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


поскольку ваши 3 условия фиксированы, вы можете иметь их сначала, а затем другие, которые могут быть преобразованы в switch-case.

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