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