Тернарные операторы с более чем одной переменной - PullRequest
1 голос
/ 09 марта 2019

Я познакомился с концепцией троичных операторов, и довольно просто понять нотацию:

desired_variable = true ? false ? "value1" : "value2";

Я, однако, не мог понять, почему стоит добавить вторую переменную, даже если я понимаю ответ. Чтобы использовать классический пример:

var eatsPlants = false;
var eatsAnimals = false;
var category;

category = eatsPlants ? eatsAnimals ? "omnivore" : "herbivore" : eatsAnimals ? "carnivore" : undefined;
console.log(category)

Здесь одно замечание: если я изменю порядок переменных на приведенный ниже оператор, функция не будет работать:

category = eatsAnimals ? eatsPlants? "carnivore" : undefined : eatsPlants ? "herbivore" : "omnivore";
console.log(category)

Мой вопрос: почему функция не работает, когда термины инвертированы? И как выбрать порядок терминов, когда у меня есть две или более переменных (и, следовательно, четыре или более результатов)?

Ответы [ 5 ]

4 голосов
/ 09 марта 2019

Тернарные выражения имеют 3 выражения внутри них.Однако, поскольку троичные выражения сами являются выражениями, вы можете помещать троичные выражения в другие троичные выражения.Тернарные выражения в приведенном выше примере выглядят настолько запутанно, потому что они представляют собой множественные вложенные троичные выражения.Эту путаницу лучше устранить с помощью форматирования и использования скобок:

var eatsPlants = false;
var eatsAnimals = false;
var category = null;

category =
  (eatsPlants ?
    (eatsAnimals ? "omnivore" : "herbivore")
    :
    (eatsAnimals ? "carnivore" : undefined)
  );
console.log(category);
2 голосов
/ 09 марта 2019

Вы можете понять по этому примеру.

x ? ( y ? a : b ) : c
|
|________true   ---> y ? a : b
|
|________false  ---> c
  • сначала проверьте значение x, если оно истинно, оно запустится y ? a : b (я добавил () только для удобства чтения)
  • Если оно ложно, оно перейдет к c

Вы можете просто понять это так же, как если бы / иначе, если я изменю код выше на if / else

if(x){
  if(y) {
    return a
  } else {
    return b
} else {
   return c
 }
}
1 голос
/ 09 марта 2019

Чтобы получить правильный результат, вы можете сгруппировать троичные и поддерживать тот же уровень решений.

var eatsPlants = false,
    eatsAnimals = false,
    category = eatsPlants
        ? eatsAnimals
            ? "omnivore"
            : "herbivore"
        : eatsAnimals
            ? "carnivore"
            : undefined;

console.log(category);
0 голосов
/ 09 марта 2019

Для троичной операции всегда требуется три операнда, например:

inputExpression ? outputExpressionIfTrue : outputExpressionIfFalse

Код, о котором идет речь, использует выходные данные некоторых троичных операций в качестве входных выражений для других, что можно увидеть более четко, если мыотформатируйте его как в этом фрагменте кода.В каждом случае внешняя операция возвращает результат любой внутренней операции (и комментарии объясняют, какая внутренняя операция выполняется и что она возвращает).

var eatsPlants = false;
var eatsAnimals = false;
var category;

category = eatsPlants
  ? (eatsAnimals ? "omnivore" : "herbivore") // doesn't run because eatsPlants is false
  : (eatsAnimals ? "carnivore" : undefined); //returns undefined because eatsAnimals is false 
console.log(category);

category = eatsAnimals
 ? (eatsPlants ? "carnivore" : undefined) // doesn't run because eatsAnimals is false
 : (eatsPlants ? "herbivore" : "omnivore"); // returns "omnivore" because eatsPlants is false
console.log(category);

Обратите внимание, что для обработки информации о категориях вещей со схожими свойствами может быть полезно использовать объекты, например:

const carnivore =  {
  eatsPlants: false,
  eatsAnimals: true
};
const herbivore =  {
  eatsPlants: true,
  eatsAnimals: false
};
const omnivore =  {
  eatsPlants: true,
  eatsAnimals: true
};

console.log("carnivore:");
console.log("  eatsPlants: " + carnivore.eatsPlants);
console.log("  eatsAnimals: " + carnivore.eatsAnimals);
console.log("herbivore:");
console.log("  eatsPlants: " + herbivore.eatsPlants);
console.log("  eatsAnimals: " + herbivore.eatsAnimals);
console.log("omnivore:");
console.log("  eatsPlants: " + omnivore.eatsPlants);
console.log("  eatsAnimals: " + omnivore.eatsAnimals);  
0 голосов
/ 09 марта 2019

Нельзя изменить порядок между then и else частями, так как это влияет на результат (если вы не отменяете условие).Однако вы можете изменить вложенность и написать

category = eatsPlants
  ? eatsAnimals
      ? "omnivore"
      : "herbivore"
  : eatsAnimals
      ? "carnivore"
      : undefined;

или

category = eatsAnimals
  ? eatsPlants
      ? "omnivore"
      : "carnivore"
  : eatsPlants
      ? "herbivore"
      : undefined;
...