Ich habe einen ternären Operator in JavaScript verwendet, um den Wert eines Objekts basierend auf Benutzereingaben zu ändern. Ich habe den folgenden Code, der so läuft, wie er sollte:
var inputOneAns = inputOne == "Yes" ? "517" : "518";
Wie Sie sehen, weise ich inputOneAns
einen numerischen Zeichenfolgenwert zu, wenn ein Benutzer "Ja" oder "Nein" eingegeben hat. Es kann jedoch vorkommen, dass ein Benutzer keinen Wert ausgewählt hat (da dies nicht erforderlich ist). Wenn diese Eingabe leer gelassen wurde, möchte ich inputOneAns
eine leere Zeichenfolge zuweisen. Gibt es eine Möglichkeit, einen ternären Operator in einen anderen ternären Operator einzubetten? Zur Verdeutlichung ist hier die gleiche Funktion, die ich mit meiner ternären Funktion, aber mit if else-Anweisungen, ergänzen möchte.
if (inputOne == "Yes"){
var inputOneAns = "517"
}else if (inputOne == "No"{
var inputOneAns = "518"
}else{
var inputOneAns = ""
}
Ist es möglich, mehrere Ausdrücke in eine ternäre Funktion aufzunehmen? Gibt es einen besseren Weg, um das zu erreichen, wonach ich suche? Vielen Dank für die Tipps im Voraus.
Ja, du kannst wilde Nestchen treiben. Ich finde diese Version gut lesbar:
var foo = (
bar === 'a' ? 1 : // if
bar === 'b' ? 2 : // else if
bar === 'c' ? 3 : // else if
null // else
);
dies ist jedoch keine allgemein verbreitete Meinung, und Sie sollten sich wahrscheinlich an if/else
oder switch
halten, wenn Sie in einem Team arbeiten.
In solchen Situationen ist eine Wechselanweisung wahrscheinlich die beste Wahl.
let inputOneAns;
switch(inputOne) {
case "Yes":
inputOneAns = "517";
break;
case "No":
inputOneNas = "518";
break;
default:
inputOneNas = "";
}
Wenn Sie ternäre Operationen über zwei Bedingungen hinaus ausführen könnten, würden sie unglaublich chaotisch werden. Sie können Bedingungen zusammenstellen, aber ich habe keine Ahnung, warum Sie das wollen würden - das wäre unglaublich chaotisch.
var r = inputOne == "" ? "" : (
inputOne == "Yes" ? "517" : "518");
Leider bietet JavaScript keine sehr knappe und lesbare Möglichkeit, dies zu tun. Persönlich würde ich nur einzeilige if
-Anweisungen wie folgt verwenden:
var inputOneAns;
if (inputOne === 'Yes') inputOneAns = '517';
if (inputOne === 'No') inputOneAns = '518';
else inputOneAns = '';
Was noch sauberer sein kann, wenn Sie es in eine Funktion abstrahieren (Hinweis: In diesem Fall ist else
nicht erforderlich):
function getInputOneAns(inputOne) {
if (inputOne === 'Yes') return '517';
if (inputOne === 'No') return '518';
return '';
}
Ich persönlich mag es aus zwei Gründen nicht wirklich, Anweisungen zu wechseln. Erstens, die zusätzlichen break
-Anweisungen, die den Code aufblähen, und zweitens sind die Anweisungen zum Wechseln sehr einschränkend. Wenn Sie wissen, dass Sie immer eine einzelne Zeichenfolge prüfen, würde ich ein einfaches Kartenobjekt bevorzugen:
var map = { 'Yes': '517', 'No': '518' };
var inputOneAns = map[inputOne] || '';
Ja, Sie können sie ähnlich wie eine else if-Anweisung miteinander verketten, aber manchmal kann es schwierig sein, sie zu lesen, daher neige ich dazu, meine auf mehrere Zeilen aufzuteilen.
var inputOneAns = inputOne == 'Yes' ? '517' :
inputOne == 'No' ? '518' : '';
In diesem Fall würde ich jedoch eine switch
-Anweisung vorschlagen, da Sie für jeden Fall den gleichen Wert vergleichen.
Scheint wie eine klassische Verwendung für eine switch-Anweisung:
let inputOneAns = '';
switch(inputOne) {
case 'Yes':
inputOneAns = "517";
break;
case 'No':
inputOneAns = "518";
break;
default:
inputOneAns = "";
}
Am elegantesten und saubersten ist es, die Object-Literale zu nutzen:
const Switch = (str) => ({
"Yes": "517",
"No": "518",
})[str] || '';
console.log(Switch("Yes")); // 517
console.log(Switch("No")); // 518
console.log(Switch("Non matching value")); // Empty
Dies hat den Vorteil, dass es sowohl lesbar als auch flexibel ist.