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 à inputOneAns
qu’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.
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.
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é.
var r = inputOne == "" ? "" : (
inputOne == "Yes" ? "517" : "518");
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] || '';
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.
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 = "";
}