JS Вложенная троичная с несколькими условиями - PullRequest
0 голосов
/ 10 апреля 2020

По существу, у меня есть следующая проблема:

if condition A & B are true ->. do thing A
if only condition A is true -> do thing B 
else -> do thing C

Я пробовал это:

const myThing = conditionA ? conditionB ? thingA :
conditionA ? thingB : thingC;

Не нравится синтаксис, но я не уверен, что с ним не так.

Ответы [ 4 ]

2 голосов
/ 10 апреля 2020
const myThing =
  conditionA && conditionB ? thingA : conditionA ? thingB : thingC;
2 голосов
/ 10 апреля 2020

Вы уже выписали логи c с if / else, так почему бы не сделать это в IIFE? Это будет более читабельно, чем использование условного оператора:

const myThing = (() => {
  if (conditionA && conditionB) {
    return thingA;
  } else if (conditionA) {
    return thingB;
  } else {
  return thingC;
  }
})();

Вы также можете поместить его в отдельную функцию:

const getThing = (conditionA, conditionB, conditionC) => {
  if (conditionA && conditionB) {
    return thingA;
  } else if (conditionA) {
    return thingB;
  } else {
  return thingC;
  }
};
const myThing = getThing(conditionA, conditionB, conditionC);

Вместо того, чтобы повторять тест conditionA, вы мог бы сначала проверить его отрицание , чтобы сделать его немного проще:

const getThing = (conditionA, conditionB, conditionC) => {
  if (!conditionA) {
    return thingC;
  } else if (conditionB) {
    return thingB;
  } else {
    return thingA;
  }
};
1 голос
/ 10 апреля 2020

Попробуйте использовать:

const myThing = conditionA?(conditionB?thingA:thingB):thingC;

Надеюсь, это поможет.

Проблема с вашим кодом состоит в том, что вашей троичной операции требуется 2 выражения: одно, если условие истинно, и другое, если условие false Но в вашем коде не указано ложное условие для данного:

conditionA ? thingB 

часть кода.

0 голосов
/ 10 апреля 2020

То, что вы на самом деле хотели написать, кажется

const myThing = conditionA ? conditionB ? thingA : thingB : thingC;

Однако я не рекомендую написать это, поскольку читать и писать намного сложнее как вы уже испытали. Я добавляю это просто как объяснение того, как работают условные операторы, и , надеюсь, , чтобы продемонстрировать, что вы не должны использовать их для чего-либо удаленно сложного. Я нахожу очень ограниченное применение для условного в целом и не пропущу его, если оно никогда не использовалось. Используйте if/else вместо .

Для ясности это выражение разрешается следующим образом:

const myThing = conditionA ? (conditionB ? thingA : thingB) : thingC;
  • , если conditionA равно true - оцените второй условный оператор
    • если conditionB равен true - возврат thingA
    • если conditionB равен false - возврат thingB
  • если conditionA равно false - возврат thingC

Воспроизводится в логической комбинации c, где

if (A) {
  if (B) {}
}

эквивалентно объединению двух условия через AND

if (A && B) ()

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

const x = A ? B ? C ? "one" : "two" : "three" : "four";

и

if (A && B && C) return "one";
if (A && B) return "two";
if (A) return "three";

return "four"

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

...