Wie verkürzt man eine lange if else-Anweisung?

Ich versuche herauszufinden, wie ich eine mögliche lange, wenn auch andere Aussage rationalisieren kann.

Es gibt 8 Möglichkeiten, die ausgewählt werden können und für jede Option 1-8 möchte ich eine Nachricht anzeigen.

Zum Beispiel funktioniert das, aber ich weiß, dass es viel besser geschrieben werden kann:

if(this.cv == '1'){ 
 console.log('Greater Then 1');
} else
if(this.cv == '2'){
 console.log('Greater Than 2');
}

usw.

Auf der Suche nach etwas mehr Dynamik.

0
Diese Frage scheint off-topic zu sein, da es sich um eine Codeüberprüfung handelt - codereview.stackexchange.com .
hinzugefügt der Autor lifetimes, Quelle
Wenn Sie nur eine Eins-Eins-Suche benötigen, brauchen Sie keinen Schalter, der langsamer als eine LUT ist: console.log ({1: 'gt one', 2: 'gt two'} [this.cv])
hinzugefügt der Autor dandavis, Quelle

8 Antworten

Dafür wurde die Anweisung switch erstellt.

switch(this.cv) {
case '1':
    console.log("Greater than 1");
    break;
case '2':
    console.log("Greater than 2");
    break;
}

Sie können sogar eine "Catch-All" -Standardaktion hinzufügen:

default:
    console.log("I don't know what to do with "+this.cv);
0
hinzugefügt
switch(n)
{
case '1':
  execute code block 1
  break;
case '2':
  execute code block 2
  break;
default:
  code to be executed if n is different from case 1 and 2
}
0
hinzugefügt

Benutze eine Karte:

var messages = {
    '1' : 'Greater than 1',
    '2' : 'Greater than 2',
   ....etc
}

console.log(messages[this.cv]);
0
hinzugefügt
@dandavis Intern ist dies ziemlich genau das, was switch tut, aber mit einem Block von Anweisungen statt nur einer Zeichenkette.
hinzugefügt der Autor Niet the Dark Absol, Quelle
Danke das ist wirklich hilfreich!
hinzugefügt der Autor TikaL13, Quelle
@ TikaL13 - Kein Problem, glücklich zu helfen!
hinzugefügt der Autor adeneo, Quelle
Ich hätte es selbst nicht besser sagen können, obwohl ich es versucht habe ... warum viele Vergleiche in einem Switch ausführen, wenn Sie stattdessen eine Namensauflösung ausführen können?
hinzugefügt der Autor dandavis, Quelle
switch wertet jeden Fall aus, zB: switch (true), ein Objekt nicht. Bank im Zweifel.
hinzugefügt der Autor dandavis, Quelle

Wenn das das genaue Format Ihrer Nachricht ist (in allen Fällen), dann könnten Sie einfach schreiben:

console.log('Greater Than ' + this.cv);

Wenn Sie jedoch in jedem Fall mehr Flexibilität benötigen, können Sie eine switch -Anweisung verwenden, wie andere Antworten vorgeschlagen haben.

0
hinzugefügt

hängt ab, manchmal habe ich viele Funktionen zu verschiedenen Variablen hinzufügen.

In diesem Fall benutze ich lieber so etwas. Ich erstelle ein Objekt mit den Antwoderten. dann überprüfe ich, ob die Antwodert existiert und führe sie aus. Ich bevoderzuge das über den Schalter

var a={'2':'greater than 2','1':'greater than 1'}
console.log(a[this.cv]?a[this.cv]:'')

Eine andere Möglichkeit, dies zu schreiben ist

 var a={'2':'greater than 2','1':'greater than 1'}
 !a[this.cv]||(console.log(a[this.cv]));

oder wenn Sie nur einen kurzen Check machen müssen, verwende ich Javascript shoderthand.

console.log('Greater then '+(a=this.cv,a==1)?1:(a==2)?2:'whatever');

oder

console.log('Greater then '+(this.cv==1?1:2));

und in deinem Fall a

console.log('Greater than '+this.cv);

sollte genug sein.

0
hinzugefügt

Verwenden Sie eine switch-Anweisung:

switch(this.cv)
{
case '1':
  console.log('Greater Than 1');
  break;
case '2':
  console.log('Greater Than 2');
  break;
default:
  //executed if no matches are found
}

Oder eine Karte würde funktionieren auch gut pro Adeneo's Antwort, da dies im Wesentlichen wie eine switch-Anweisung implementiert ist. Beide sind gute Optionen zum Komprimieren mehrerer if-Anweisungen.

0
hinzugefügt

Sie können eine switch-Anweisung verwenden, überprüfen Sie diesen Link für weitere Details

Allgemeine Syntax von SWITCH:

switch (expression) {
  case label1:
    statements1
    [break;]
  case label2:
    statements2
    [break;]
  ...
  case labelN:
    statementsN
    [break;]
  default:
    statements_def
    [break;]
}

In Ihrem Fall :

switch(this.cv) {
case '1':
    console.log("Greater than 1");
    break;
case '2':
    console.log("Greater than 2");
    break;
}
0
hinzugefügt
@ j08691 Während der geschriebene Code nicht sein darf, sind die ausgeführten Operationen sicherlich;)
hinzugefügt der Autor Niet the Dark Absol, Quelle
Ich muss diese Antwort jedoch ablehnen, weil Sie es zu kompliziert gemacht haben. [break;] ... während ich es als "optional break; " verstehe, andere nicht.
hinzugefügt der Autor Niet the Dark Absol, Quelle
Dies wäre nicht wesentlich kürzer als eine Reihe von if-Anweisungen.
hinzugefügt der Autor j08691, Quelle
Nun, du solltest mit mozilla reden, weil ich einfach die Syntax kopiert habe :) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
hinzugefügt der Autor Charaf JRA, Quelle

Ich würde sagen, erstellen Sie ein Objekt, das die möglichen Werte auf Nachrichten abbildet und einfach die Nachricht von der Karte wie folgt abruft:

var messages = {'1': 'Greater Then 1',
                '2': 'Greater Than 2'};
console.log(messages[this.cv]);
0
hinzugefügt
Vorsicht, Sie versuchen, das Array mit einem Zeichenwert und nicht mit einer Ganzzahl zu indizieren.
hinzugefügt der Autor Joel, Quelle
Sie können ... Ihre Bearbeitung ist vielleicht eine bessere Übung!
hinzugefügt der Autor Joel, Quelle
Arrays werden durch Strings indiziert, was ist das Problem?
hinzugefügt der Autor dandavis, Quelle
Ich denke, es würde tatsächlich in der ursprünglichen Option funktionieren, aber ich stimme zu, dass das, was Sie vorgeschlagen haben, es klarer macht, was es tut, besonders, da Sie es mit einem String-Wert abrufen.
hinzugefügt der Autor Bart Enkelaar, Quelle
JavaScript - Deutsche Gemeinschaft
JavaScript - Deutsche Gemeinschaft
3 der Teilnehmer

In dieser Gruppe sprechen wir über JavaScript.