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