2
votes

Opérateurs ternaires avec plus d'une variable

J'ai été initié au concept d'opérateurs ternaires, et il est assez simple de comprendre la notation:

desire_variable = true? faux ? "value1": "value2";

Je ne pouvais pas comprendre, cependant, le rationnel derrière l'ajout d'une deuxième variable, même si je comprends la réponse. Pour utiliser un exemple classique:

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

Ici, une observation: si je change l'ordre des variables en suivant l'instruction ci-dessous, la fonction ne fonctionne pas:

XXX

Ma question: pourquoi la fonction ne fonctionne-t-elle pas lorsque les termes sont inversés? Et comment choisir l'ordre des termes lorsque j'ai deux variables ou plus (et donc quatre résultats ou plus)?


3 commentaires

il n'y a qu'un seul point d'interrogation et deux points dans un seul ternaire, comme variable = comparaison? valeur1: valeur2;


En général, si votre opérateur ternaire n'est pas super simple, vous devriez probablement éviter d'écrire la logique comme un opérateur ternaire et simplement faire if / else à la place. Il n'y a aucun avantage à avoir tout sur une seule ligne si cela vous prend plus de temps pour lire et comprendre ce qui se passe.


Je suis d'accord sur le si / sinon serait plus clair. Le problème est que j'essaie d'obtenir la pensée logique plus que le résultat final.


5 Réponses :


2
votes

Vous pouvez comprendre grâce à cet exemple.

if(x){
  if(y) {
    return a
  } else {
    return b
} else {
   return c
 }
}
  • vérifiez d'abord la valeur de x si elle est vraie, elle exécutera y? a: b (j'ai ajouté () juste pour la lisibilité)
  • S'il est faux, il ira à c

Vous pouvez simplement le comprendre comme if / else, si je change le code ci-dessus en if / else

x ? ( y ? a : b ) : c
|
|________true   ---> y ? a : b
|
|________false  ---> c


1 commentaires

Merci, cela m'a beaucoup aidé.



4
votes

Les expressions ternaires ont 3 expressions à l'intérieur d'elles. Cependant, comme les expressions ternaires sont elles-mêmes des expressions, vous pouvez placer des expressions ternaires dans d'autres expressions ternaires. Les expressions ternaires de votre exemple ci-dessus semblent si déroutantes car ce sont plusieurs expressions ternaires imbriquées. Cette confusion peut être mieux dissipée avec le formatage et l'utilisation de parenthèses:

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

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


0 commentaires

1
votes

Pour obtenir un bon résultat, vous pouvez regrouper les ternaires et maintenir le même niveau de décisions.

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

console.log(category);


0 commentaires

0
votes

Vous ne pouvez pas modifier l'ordre entre les parties puis et else , car cela affecte le résultat (si vous n'annulez pas également la condition). Vous pouvez toutefois modifier l'imbrication et écrire soit

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

ou

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


0 commentaires

0
votes

Une opération ternaire prend toujours trois opérandes, comme:

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);  

Le code de la question utilise la sortie de certaines opérations ternaires comme expression d'entrée pour d'autres, ce qui peut être vu plus clairement si nous le formons comme dans cet extrait de code. Dans chaque cas, l'opération externe renvoie le résultat de l'opération interne exécutée (et les commentaires expliquent quelle opération interne s'exécute et ce qu'elle renvoie.)

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);

Notez que pour gérer les informations sur les catégories d'objets ayant des propriétés similaires, il peut être utile d'utiliser des objets, comme:

inputExpression ? outputExpressionIfTrue : outputExpressionIfFalse


0 commentaires