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

Ответ 1

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

Ответ 2

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

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, условие cat > 0 || price > 0 || jsBed <= bedroom || jsBuilt >= built является бесполезным ebcause, уже встреченным в первом. Поскольку вы используете else 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) { 

}

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

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

Ответ 3

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

Ответ 4

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)

(Я пропустил другие vars...) Затем добавьте двоичные значения

const total = locVal + catVal + priceVal

Затем вам нужно использовать оператор case switch, например

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. Следует отметить, что очень важно документировать код очень хорошо, особенно блоки блокировки, так что другие читатели могут выяснить, какое именно значение означает то, что (как и я).

Если в переменной имеется более двух опций, вы можете работать с коэффициентами 10 (например, в методе foo, используйте (trueCond ? 1 : 0) * Math.pow(10, level))

Ответ 5

Поскольку ваши 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;
    }
}