web-dev-qa-db-fra.com

JS Ternary fonctions avec plusieurs conditions?

J'utilisais un opérateur ternaire en JavaScript pour modifier la valeur d'un objet en fonction des entrées de l'utilisateur. J'ai le code suivant, qui fonctionne comme il se doit:

var inputOneAns = inputOne == "Yes" ? "517" : "518";

Comme vous pouvez le constater, j’assigne une valeur de chaîne numérique à inputOneAnsqu’un utilisateur ait entré "Oui" ou "Non". Cependant, il peut arriver qu'un utilisateur n'ait pas sélectionné de valeur (car ce n'est pas obligatoire). Si cette entrée était laissée en blanc, je voudrais assigner une chaîne vide "" à inputOneAns. Existe-t-il un moyen pour moi d’inclure un opérateur ternaire dans un autre opérateur ternaire? Pour aider à clarifier, voici la même fonction que je veux accompagner avec ma fonction ternaire mais avec les déclarations if else?

if (inputOne == "Yes"){
    var inputOneAns = "517"
}else if (inputOne == "No"{
    var inputOneAns = "518"
}else{
    var inputOneAns = ""
}

Est-il possible d'inclure plusieurs expressions dans une fonction ternaire? Y a-t-il une meilleure façon d'accomplir ce que je recherche? Merci pour les conseils à l'avance.

6
user7366442

Oui, vous pouvez aller dans les ternaires de nidification sauvages. Je trouve cette version assez lisible:

var foo = (
  bar === 'a' ? 1 : // if 
  bar === 'b' ? 2 : // else if 
  bar === 'c' ? 3 : // else if
  null // else 
);

mais ce n'est pas une opinion largement partagée, et vous devriez probablement vous en tenir à if/else ou switch lorsque vous travaillez en équipe.

10
Damon

Une instruction switch est probablement le meilleur choix dans une situation comme celle-ci.

let inputOneAns;
switch(inputOne) {
  case "Yes":
   inputOneAns = "517";
   break;
  case "No":
   inputOneNas = "518";
   break;
  default:
   inputOneNas = "";
}

Si vous pouviez faire des opérations ternaires au-delà de 2 conditions, elles deviendraient incroyablement compliquées. Vous pouvez mettre des conditions ensemble, mais je ne vois pas pourquoi vous voudriez que ce soit incroyablement désordonné.

3
Ramzi C.
var r = inputOne == "" ? "" : ( 
inputOne == "Yes" ? "517" : "518");
1
Abrar Hossain

Malheureusement, JavaScript ne fournit pas un moyen extrêmement concis et lisible de le faire. Personnellement, je voudrais juste utiliser des déclarations if sur une seule ligne comme ceci:

var inputOneAns;
if (inputOne === 'Yes') inputOneAns = '517';
if (inputOne === 'No') inputOneAns = '518';
else inputOneAns = '';

Ce qui peut être encore plus propre si vous la résumez dans une fonction (remarque: pas besoin de else dans ce cas):

function getInputOneAns(inputOne) {
    if (inputOne === 'Yes') return '517';
    if (inputOne === 'No') return '518';
    return '';
}

Personnellement, je n'aime pas trop les instructions switch pour cela pour deux raisons: d’une part, ces instructions extra break qui gonflent le code, et d’autre part, ces instructions sont très limitatives: vous ne pouvez effectuer que de simples vérifications d’égalité, et seulement contre une seule variable. De plus, dans le cas où vous savez que vous allez toujours vérifier une seule chaîne, je préférerais un simple objet map:

var map = { 'Yes': '517', 'No': '518' };
var inputOneAns = map[inputOne] || '';
1
jackocnr

Yeh, vous pouvez les relier comme si vous utilisiez une autre instruction if, mais elle peut parfois être un peu difficile à lire, alors j'ai tendance à diviser la mienne sur plusieurs lignes.

var inputOneAns = inputOne == 'Yes' ? '517' :
  inputOne == 'No' ? '518' : '';

Cependant, dans ce cas, je suggérerais une instruction switch, car vous comparez la même valeur pour chaque cas.

0
BenShelton

Cela ressemble à une utilisation classique pour une instruction switch: 

let inputOneAns = '';
switch(inputOne) {
  case 'Yes':
    inputOneAns = "517";
    break;
  case 'No': 
    inputOneAns = "518";
    break;
  default:
    inputOneAns = "";
}
  • notez que vous n'avez pas réellement besoin du cas par défaut, mais je trouve que cela rend les choses plus lisibles.
0
RickTakes