webentwicklung-frage-antwort-db.com.de

JS Ternäre Funktionen mit mehreren Bedingungen?

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.

6
user7366442

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.

10
Damon

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.

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

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] || '';
1
jackocnr

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.

0
BenShelton

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 = "";
}
  • beachten Sie, dass Sie den Standardfall nicht wirklich benötigen, aber ich finde, er macht die Sache lesbarer.
0
RickTakes

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.

0
Mosè Raguzzini