Учитывая следующий код:
if (CONDITION1) {
if (CONDITION2) {
if (CONDITION3) {
if (CONDITION4) {
if (CONDITION5) {
} else {
return ('STOP IN CONDITION5')
}
} else {
return ('STOP IN CONDITION4')
}
} else {
return ('STOP IN CONDITION3')
}
} else {
return ('STOP IN CONDITION2')
}
} else {
return ('STOP IN CONDITION1')
}
Мне нужно заменить эти множественные операторы if
другим кодом, используя передовой опыт, и для более чистого чтения другими людьми в будущем.
Если условное выражение if
ничего не делает, вы можете даже убрать фигурные скобки (а также оператор группировки): if (!conditionX) return "stop in conditionX";
.
Пожалуйста, не опускайте фигурные скобки, как было предложено выше. Выглядит ужасно, проще допустить ошибку, и большинство линтеров требуют их по умолчанию.
Вы можете сгладить это, проверив условие not:
function doStuff() {
if (!CONDITION1) {
return ('STOP IN CONDITION1')
}
if (!CONDITION2) {
return ('STOP IN CONDITION2')
}
if (!CONDITION3) {
return ('STOP IN CONDITION3')
}
if (!CONDITION4) {
return ('STOP IN CONDITION4')
}
if (!CONDITION5) {
return ('STOP IN CONDITION5')
}
}
Примечание: между if
вы можете добавить код условия true
.
На этот вопрос уже был дан ответ, и я бы не рекомендовал эту версию (вероятно, линтеры жалуются, плоские операторы if
в порядке), но я добавляю ее туда, чтобы показать другую возможность.
Потенциально вы можете использовать оператор switch и добавлять свои условия в каждый случай:
const CONDITION1 = 1 > 2
const CONDITION2 = 2 < 1
const run = () => {
switch(true) { // always evaluate this switch
case !CONDITION1:
return 'STOP IN CONDITION1'
case !CONDITION2:
return 'STOP IN CONDITION1'
// etc...
}
}
console.info(run())
(x) => x
, он будет обработан как boolean
и если true
метод вернет индекс. Сохраните возвращенное целое число в переменную errIndex
.errIndex
больше, чем -1
, это означает, что у вас есть «ошибка» в массиве conditions
по этому индексу.const conditions = [false, false, true, false, false];
const errIndex = conditions.findIndex(x => x);
if (errIndex > -1) {
console.info(`STOP IN CONDITION ${errIndex + 1}`);
} else {
console.info("All passed");
}
Прелесть использования .findIndex() заключается в том, что он может сократить поиск и немедленно вернуть индекс.
Не знаю, почему, но учитывая, что вы хотите return
строку, и поскольку операторы return
используются внутри функции, и поскольку всегда предпочтительнее, чтобы функция возвращала один и тот же тип,
вы можете создать функцию, которая принимает массив условий и строку успеха в качестве второго аргумента:
const status = (conditions, successMsg) => {
const idx = conditions.findIndex(x=>x);
return idx < 0 ? successMsg : `STOP IN CONDITION ${idx+1}`;
};
console.info(status([false, false, true, false, false], "OK")); // STOP IN CONDITION 3
console.info(status([false, false, false, false, false], "OK")); // OK
или вы можете создать что-то подобное на основе приведенной выше идеи, например функцию pass
, в которой вы не жестко кодируете строки ошибок, а вместо этого предоставляете функцию обратного вызова с аргументом, являющимся объектом с индексным свойством или null
const pass = (conditions, fn) => {
const index = conditions.findIndex(x => x);
fn(index < 0 ? null : {index});
};
pass([false, false, true, false, false], (err) => {
if (err) {
console.info(`STOP IN CONDITION ${err.index + 1}`)
return; // Exit function here
}
// All OK...
console.info("All OK! Do some work here");
});
Остальные, скорее всего, не нужны. Попробуйте
if (!condition) { return ... }
?