Wie ich meine bedingten Aussagen verkürzen kann

154

Ich habe eine sehr lange bedingte Aussage wie die folgende:

if(test.type == 'itema' || test.type == 'itemb' || test.type == 'itemc' || test.type == 'itemd'){
    // do something.
}

Ich habe mich gefragt, ob ich diesen Ausdruck / diese Aussage in eine präzisere Form umgestalten könnte.

Irgendeine Idee, wie dies erreicht werden kann?

FlyingCat
quelle
23
Sie können sie in ein Array einfügen und verwenden in?
Jeremy
jetzt nur, wenn jemand überprüfen könnte, welcher der schnellste ist
Muhammad Umer
3
Dies ist vielleicht ein Schock für alle, aber was OP hat, ist ein klarer Gewinner in Sachen Geschwindigkeit !!!!!!! Vielleicht kann der Browser dafür viel optimieren. Ergebnisse: (1) wenn mit ||. (2) switchAussagen. (3) Regex. (4) ~. jsperf.com/if-statements-test-techsin
Muhammad Umer
3
Möglicherweise nähern Sie sich dem auch falsch an. In diesem Fall haben diese 4 Typen etwas gemeinsam. Was ist es? Wenn wir dies auf einen extremeren Fall bringen, was wäre, wenn wir 10 weitere Typen hinzufügen müssten, um dieser Bedingung zu entsprechen. Oder 100? Wenn es mehr gäbe, würden Sie wahrscheinlich nicht in Betracht ziehen, diese oder eine der anderen vorgeschlagenen Lösungen zu verwenden. Sie sehen eine große if-Aussage wie diese und denken, es sei ein Code-Geruch, was ein gutes Zeichen ist. Der beste Weg, dies präziser zu gestalten, wäre, wenn Sie if (test.your_common_condition) schreiben könnten. In diesem Zusammenhang ist es einfacher zu verstehen und erweiterbarer.
Gmacdougall

Antworten:

241

Fügen Sie Ihre Werte in ein Array ein und überprüfen Sie, ob sich Ihr Element im Array befindet:

if ([1, 2, 3, 4].includes(test.type)) {
    // Do something
}

Wenn ein von Ihnen unterstützter Browser nicht über die Array#includesMethode verfügt, können Sie diese Polyfüllung verwenden .


Kurze Erklärung der ~Tilde-Verknüpfung:

Update: Da wir jetzt die includesMethode haben, macht es keinen Sinn ~mehr , den Hack zu verwenden. Bewahren Sie dies hier für Personen auf, die wissen möchten, wie es funktioniert, und / oder die im Code anderer Benutzer darauf gestoßen sind.

Anstatt zu überprüfen, ob das Ergebnis von indexOfist >= 0, gibt es eine nette kleine Verknüpfung:

if ( ~[1, 2, 3, 4].indexOf(test.type) ) {
    // Do something
}

Hier ist die Geige: http://jsfiddle.net/HYJvK/

Wie funktioniert das? Wenn ein Element im Array gefunden wird, wird indexOfsein Index zurückgegeben. Wenn der Artikel nicht gefunden wurde, wird er zurückgegeben -1. Ohne zu sehr ins Detail zu gehen, ~ist der ein bitweiser NOT-Operator , der 0nur für zurückgibt-1 .

Ich verwende gerne die ~Verknüpfung, da sie prägnanter ist als ein Vergleich des Rückgabewerts. Ich wünschte, JavaScript hätte eine in_arrayFunktion, die einen Booleschen Wert direkt zurückgibt (ähnlich wie PHP), aber das ist nur Wunschdenken ( Update: das tut es jetzt. Es heißt includes. Siehe oben). Beachten Sie, dass jQuery's inArray, während es die Methodensignatur von PHP teilt, tatsächlich die native indexOfFunktionalität nachahmt (was in verschiedenen Fällen nützlich ist, wenn der Index genau das ist, wonach Sie wirklich suchen).

Wichtiger Hinweis: Die Verwendung der Tilde-Verknüpfung scheint kontrovers diskutiert zu werden, da einige vehement der Ansicht sind, dass der Code nicht klar genug ist und unter allen Umständen vermieden werden sollte (siehe die Kommentare zu dieser Antwort). Wenn Sie ihre Meinung teilen, sollten Sie sich an die .indexOf(...) >= 0Lösung halten.


Eine etwas längere Erklärung:

Ganzzahlen in JavaScript sind signiert. Dies bedeutet, dass das Bit ganz links als Vorzeichenbit reserviert ist. ein Flag, das angibt, ob die Zahl positiv oder negativ ist, wobei a 1negativ ist.

Hier sind einige positive Beispielzahlen im 32-Bit-Binärformat:

1 :    00000000000000000000000000000001
2 :    00000000000000000000000000000010
3 :    00000000000000000000000000000011
15:    00000000000000000000000000001111

Hier sind die gleichen Zahlen, aber negativ:

-1 :   11111111111111111111111111111111
-2 :   11111111111111111111111111111110
-3 :   11111111111111111111111111111101
-15:   11111111111111111111111111110001

Warum so komische Kombinationen für die negativen Zahlen? Einfach. Eine negative Zahl ist einfach die Umkehrung der positiven Zahl + 1; Das Addieren der negativen Zahl zur positiven Zahl sollte immer ergeben 0.

Um dies zu verstehen, führen wir eine einfache binäre Arithmetik durch.

Hier ist , wie wir hinzufügen würde -1zu +1:

   00000000000000000000000000000001      +1
+  11111111111111111111111111111111      -1
-------------------------------------------
=  00000000000000000000000000000000       0

Und hier ist , wie wir hinzufügen würde -15zu +15:

   00000000000000000000000000001111      +15
+  11111111111111111111111111110001      -15
--------------------------------------------
=  00000000000000000000000000000000        0

Wie bekommen wir diese Ergebnisse? Wenn Sie regelmäßig hinzufügen, wie wir es in der Schule gelernt haben: Sie beginnen in der Spalte ganz rechts und addieren alle Zeilen. Wenn die Summe größer ist als die größte einstellige Zahl (die dezimal 9, aber binär ist 1), übertragen wir den Rest in die nächste Spalte.

Wie Sie feststellen werden, hat die Spalte ganz rechts, die nicht alle 0s ist, beim Hinzufügen einer negativen Zahl zu ihrer positiven Zahl immer zwei 1s, was zusammen ergibt 2. Die binäre Darstellung von zwei Wesen 10tragen wir 1in die nächste Spalte und setzen ein 0für das Ergebnis in die erste Spalte. Alle anderen Spalten auf der linken Seite haben nur eine Zeile mit einem 1, so dass sich die 1aus der vorherigen Spalte übertragenen Werte wieder summieren 2, was sich dann überträgt ... Dieser Vorgang wiederholt sich, bis wir zur Spalte ganz links gelangen, wo Das 1, was übertragen werden soll, kann nirgendwo hingehen, also läuft es über und geht verloren, und wir haben 0überall s übrig .

Dieses System heißt 2's Complement . Mehr dazu lesen Sie hier:

2's Komplementdarstellung für vorzeichenbehaftete Ganzzahlen .


Jetzt, da der Crash-Kurs im 2er-Komplement beendet ist, werden Sie feststellen, dass dies -1die einzige Zahl ist, deren binäre Darstellung 1überall ist.

Mit dem ~bitweisen NOT-Operator werden alle Bits in einer bestimmten Zahl invertiert. Der einzige Weg, um 0vom Invertieren aller Bits zurück zu kommen, besteht darin, mit 1's all across' zu beginnen.

Das alles war also eine langatmige Art zu sagen, ~ndie nur zurückkehren wird, 0wenn es so nist -1.

Joseph Silber
quelle
59
Während die Verwendung von bitweisen Operatoren sicher sexy ist, ist es wirklich besser als !== -1auf irgendeine denkbare Weise? Ist eine explizite boolesche Logik nicht angemessener als die implizite Verwendung der Falschheit von Null?
Phil
21
Schön technisch, aber ich mag es nicht. Auf den ersten Blick ist nicht klar, was der Code tut, was ihn nicht wartbar macht. Ich bevorzuge die Antwort von "Yuriy Galanter".
Jon Rea
65
-1 neue Programmierer sehen Antworten wie diese, denken, es ist eine coole und akzeptable Art zu codieren, dann muss ich in 5 Jahren ihren Code beibehalten und mir die Haare ausreißen
BlueRaja - Danny Pflughoeft
23
Diese Redewendung ist in Sprachen wie C #, Java oder Python, die meine Fachgebiete sind, definitiv nicht üblich. Und ich habe gerade einige der lokalen Javascript-Experten hier gefragt, und keiner von ihnen hat es jemals zuvor gesehen. es ist also eindeutig nicht so häufig, wie Sie behaupten. Es sollte immer zugunsten der viel klareren und allgemeineren vermieden werden != -1.
BlueRaja - Danny Pflughoeft
12
-1 aufgrund unnötigen Bitfiddlings in einer Sprache, die in erster Linie nicht viel über Bitdarstellungen aussagt. Außerdem erklärt der Großteil dieser Antwort das Bitfiddling. Wenn Sie 20 Absätze schreiben müssen, um den Hack zu erklären, spart das WIRKLICH Zeit?
flauschig
242

Sie können die switch-Anweisung mit fall thru verwenden:

switch (test.type) {

  case "itema":
  case "itemb":
  case "itemc":
  case "itemd":
    // do something
}
Yuriy Galanter
quelle
9
Es ist im Grunde das gleiche wie das Wenn, der Index der Array-Methode ist weitaus besser
NimChimpsky
6
@kojiro es ist leider die richtige Antwort, aber es ist unmöglich, Aufmerksamkeit darauf zu lenken, anstatt auf den fantastischen Bitwhise-Array-Trick.
Manu343726
1
Ich wusste, dass diese Antwort hier sein musste, aber ich musste ganz nach unten scrollen, um sie zu finden. Genau dafür wurde die switch-Anweisung entwickelt und auf viele andere Sprachen übertragen. Ich habe festgestellt, dass viele Leute in einer switch-Anweisung nichts über die Fall-Through-Methode wissen.
Jimmy Johnson
3
Diese Lösung ist die schnellste unter Firefox und Safari und die zweitschnellste (nach dem Original ||) unter Chrome. Siehe jsperf.com/if-statements-test-techsin
pabouk
3
Ich denke, es wäre schrecklich, in einer Methode zu schreiben, wenn Sie viele Bedingungen hätten ... Es wäre in Ordnung für ein paar Bedingungen, aber für mehr als 10 würde ich mich für das Array entscheiden, um den Code sauber zu halten.
yu_ominae
63

Verwenden der Wissenschaft: Sie sollten das tun, was idfah gesagt hat, und dies für die schnellste Geschwindigkeit, während Sie den Code kurz halten:

Dies ist schneller als ~Methode

var x = test.type;
if (x == 'itema' ||
    x == 'itemb' ||
    x == 'itemc' ||
    x == 'itemd') {
    //do something
}

http://jsperf.com/if-statements-test-techsin Geben Sie hier die Bildbeschreibung ein (Oberer Satz: Chrome, unterer Satz: Firefox)

Fazit :

Wenn Möglichkeiten sind wenige , und Sie wissen , dass bestimmte diejenigen häufiger auftreten, als Sie maximale Performance erhalten if ||, switch fall throughund if(obj[keyval]).

Wenn es viele Möglichkeiten gibt und eine davon die am häufigsten auftretende sein könnte, können Sie mit anderen Worten nicht wissen, welche am wahrscheinlichsten auftritt, als wenn Sie die meiste Leistung aus der Objektsuche ziehen if(obj[keyval])und regexob dies passt.

http://jsperf.com/if-statements-test-techsin/12

Ich werde aktualisieren, wenn etwas Neues auftaucht.

Muhammad Umer
quelle
2
+1 für einen wirklich guten Beitrag! Wenn ich richtig verstehe, switch caseist das die schnellste Methode?
user1477388
1
in Firefox ja, in Chrom seinif ( ...||...||...)...
Muhammad Umer
8
Es ist schneller, wenn Sie wirklich viele Schleifen über diesen Eingang ausführen , aber es ist viel langsamer, wenn Sie eine Schleife mit sehr großen n (Anzahl der "itemX" -Strings) haben. Ich habe diesen Codegenerator gehackt , mit dem Sie überprüfen (oder möglicherweise widerlegen) können. obj["itemX"]ist extrem schnell, wenn n groß ist. Grundsätzlich hängt es vom Kontext ab, was schnell ist. Habe Spaß.
Kojiro
3
Es ist also die schnellste Methode, aber spielt es eine Rolle ?
Congusbongus
1
@Mich Opfere nicht die Eleganz des Codes nur für die Geschwindigkeit. Das werden dir viele, viele Leute sagen. Verwenden Sie am Ende nur den gesunden Menschenverstand.
Andre Figueiredo
32

Wenn Sie mit Zeichenfolgen vergleichen und ein Muster vorhanden ist, sollten Sie reguläre Ausdrücke verwenden.

Andernfalls wird Ihr Code vermutlich nur verschleiert, wenn Sie versuchen, ihn zu verkürzen. Ziehen Sie in Betracht, die Linien einfach zu umbrechen, um sie hübsch zu machen.

if (test.type == 'itema' ||
    test.type == 'itemb' ||
    test.type == 'itemc' ||
    test.type == 'itemd') {
    do something.
}
idfah
quelle
4
Diese Antwort ist der Gewinner in Bezug auf die Geschwindigkeit jsperf.com/if-statements-test-techsin
Muhammad Umer
1
Dies ist auch am einfachsten zu erweitern, wenn das Projekt in den Wartungsmodus wechselt (mit Regeln wie, (test.type == 'itemf' && foo.mode == 'detailed'))
Izkata
16
var possibilities = {
  "itema": 1,
  "itemb": 1,
  "itemc": 1,
…};
if (test.type in possibilities) {  }

Die Verwendung eines Objekts als assoziatives Array ist eine ziemlich häufige Sache, aber da JavaScript keine native Menge hat, können Sie Objekte auch als billige Mengen verwenden.

Kojiro
quelle
Wie ist dies kürzer als die normale if-Anweisung, die FlyingCat zu verkürzen versucht?
Dcarson
1
ifDie Bedingung der Anweisung von @dcarson OP benötigt 78 Zeichen, wenn Sie alle Leerzeichen entfernen. Meins braucht 54, wenn du es so schreibst : test.type in {"itema":1,"itemb":1,"itemc":1,"itemd":1}. Grundsätzlich verwendet er vier Zeichen für jeweils zwei Minen für jeden zusätzlichen Schlüssel.
Kojiro
1
aber du kannst machen: if (möglichkeiten [test.type]) und ganze 2 Zeichen speichern! :)
dc5
15
if( /^item[a-d]$/.test(test.type) ) { /* do something */ }

oder wenn die Gegenstände nicht so einheitlich sind, dann:

if( /^(itema|itemb|itemc|itemd)$/.test(test.type) ) { /* do something */ }
Matt
quelle
9
"Einige Leute denken, wenn sie mit einem Problem konfrontiert werden, 'Ich weiß, ich werde reguläre Ausdrücke verwenden.' Jetzt haben sie zwei Probleme. " - Jamie Zawinski, 1997
Moshe Katz
5
@MosheKatz Ich kann zwar verstehen, dass Leute gerne über dieses Zitat streiten - und die Leute verwenden sicherlich reguläre Ausdrücke für völlig ungeeignete Dinge, aber dies ist keiner von ihnen. In dem vom OP bereitgestellten Fall entspricht dies nicht nur den Kriterien, sondern auch sehr gut. Reguläre Ausdrücke sind nicht von Natur aus böse, und das Abgleichen von Zeichenfolgen mit genau definierten Parametern ist das, wofür sie gemacht sind.
Thor84no
3
@ Thor84no Normalerweise würde ich davon ausgehen, dass der Fragesteller nicht wirklich versucht, mit einem so erfundenen Beispiel wie dem ersten Fall übereinzustimmen, und dass die realen Übereinstimmungen nicht so einfach sind. In diesem Fall glaube ich nicht, dass ein RegEx läuft der richtige Weg sein, es zu tun. Anders ausgedrückt: Wenn Ihre RegEx nur eine durch Pipe-Zeichen getrennte Liste von Optionen ist, ist sie nicht besser lesbar als die anderen Vorschläge und möglicherweise erheblich weniger effizient.
Moshe Katz
10

Hervorragende Antworten, aber Sie könnten den Code besser lesbar machen, indem Sie einen von ihnen in eine Funktion einschließen.

Dies ist eine komplexe if-Anweisung, wenn Sie (oder eine andere Person) den Code in einem Jahr lesen und den Abschnitt durchsuchen, um zu verstehen, was passiert. Eine Aussage mit dieser Ebene der Geschäftslogik führt dazu, dass Sie einige Sekunden lang stolpern, während Sie herausfinden, was Sie testen. Wenn Sie einen Code wie diesen haben, können Sie mit dem Scannen fortfahren.

if(CheckIfBusinessRuleIsTrue())
{
    //Do Something
}

function CheckIfBusinessRuleIsTrue() 
{
    return (the best solution from previous posts here);
}

Benennen Sie Ihre Funktion explizit, damit sofort ersichtlich ist, was Sie testen, und Ihr Code einfacher zu scannen und zu verstehen ist.

Fran Hoey
quelle
1
Beste Antwort, die ich hier gesehen habe. Ich sehe wirklich, dass die Leute sich nicht für Prinzipien guten Designs interessieren. Sie möchten nur schnell etwas reparieren und vergessen, den Code zu verbessern, damit das System in Zukunft gewartet werden kann!
Maykonn
Wie wäre es einfach nur zu kommentieren // CheckIfBusinessRuleIsTrue?
Daniel1426
4

Sie können alle Antworten in ein Javascript-Set einfügen und dann einfach .contains()das Set aufrufen .

Sie müssen noch den gesamten Inhalt deklarieren, aber der Inline-Anruf wird kürzer.

Etwas wie:

var itemSet = new Set(["itema","itemb","itemc","itemd"]);
if( itemSet.contains( test.type ){}
Guido Anselmi
quelle
4
Das scheint ein unglaublich verschwenderischer Weg zu sein, um das zu erreichen, was das OP versucht. So , während Sie könnten eine zusätzliche 3rd-Party - Bibliothek enthalten, instanziiert ein Objekt, und der Anruf ein Verfahren auf sie, sollten Sie wahrscheinlich nicht.
KaptajnKold
@ Captain Cold: Nun, das OP hat nach Prägnanz und nicht nach Speicherbedarf gefragt. Vielleicht könnte das Set für andere Operationen wiederverwendet werden?
Guido Anselmi
1
Sicher, aber trotzdem: Würden Sie das ehrlich gesagt jemals selbst tun? Wenn ich das jemals in freier Wildbahn sehen würde, würde ich es als eine große WTF betrachten.
KaptajnKold
1
Ja, Sie haben Recht (ich habe Ihnen die +1 gegeben), aber es wird davon ausgegangen, dass diese Überprüfung nirgendwo anders durchgeführt wird. Wenn dies an mehreren anderen Stellen durchgeführt wird und / oder sich der Test ändert, ist die Verwendung des Sets möglicherweise sinnvoll. Ich überlasse es dem OP, die beste Lösung zu wählen. Alles was gesagt wurde, wenn dies eine einsame Verwendung wäre, würde ich zustimmen, dass die Verwendung des Sets den As Clown Hut der Schande verdienen würde.
Guido Anselmi
2
Ich denke tatsächlich, dass die gewählte Antwort absolut schrecklich und schlimmer ist als die Verwendung des Sets, da es absolut unlesbar ist.
Guido Anselmi
2

Eine meiner Lieblingsmethoden, um dies zu erreichen, ist eine Bibliothek wie underscore.js ...

var isItem = _.some(['itema','itemb','itemc','itemd'], function(item) {
    return test.type === item;
});

if(isItem) {
    // One of them was true
}

http://underscorejs.org/#some

jcreamer898
quelle
1
containsist wohl eine bessere Lösung alssome
Dennis
1
someHierfür muss keine Bibliothek verwendet werden: Dies ist eine Funktion des Array-Prototyps in EC5.
KaptajnKold
2
Stimmt, aber nicht jeder hat EC5-Unterstützung zur Verfügung. Außerdem mag ich den Unterstrich sehr. :)
jcreamer898
Wenn Sie bereits eine Bibliothek wie Unterstrich verwenden, ist dies wahrscheinlich der einfachste Weg. Ansonsten ist es wenig sinnvoll, eine ganze Bibliothek nur für die eine Funktion zu laden.
Moshe Katz
2

Ein anderer oder ein anderer großartiger Weg, den ich gefunden habe, ist dieser ...

if ('a' in oc(['a','b','c'])) { //dosomething }

function oc(a)
{
  var o = {};
  for(var i=0;i<a.length;i++)  o[a[i]]='';
  return o;
}

Wie Sie sehen, geht dies natürlich noch einen Schritt weiter und macht es einfach, der Logik zu folgen.

http://snook.ca/archives/javascript/testing_for_a_v

mit Operatoren wie ~ && || ((), ()) ~~ ist nur in Ordnung, wenn Ihr Code später kaputt geht. Sie werden nicht wissen, wo Sie anfangen sollen. Die Lesbarkeit ist also GROSS.

Wenn Sie müssen, können Sie es kürzer machen.

('a' in oc(['a','b','c'])) && statement;
('a' in oc(['a','b','c'])) && (statements,statements);
('a' in oc(['a','b','c']))?statement:elseStatement;
('a' in oc(['a','b','c']))?(statements,statements):(elseStatements,elseStatements);

und wenn Sie invers machen wollen

('a' in oc(['a','b','c'])) || statement;
Muhammad Umer
quelle
2

Verwenden Sie einfach eine switchAnweisung anstelle einer ifAnweisung:

switch (test.type) {

  case "itema":case "itemb":case "itemc":case "itemd":
    // do your process
  case "other cases":...:
    // do other processes
  default:
    // do processes when test.type does not meet your predictions.
}

Switch funktioniert auch schneller als das Vergleichen vieler Bedingungen innerhalb eines if

unmultimedio
quelle
2

Bei sehr langen Listen von Zeichenfolgen würde diese Idee einige Zeichen sparen (ohne zu sagen, dass ich sie im wirklichen Leben empfehlen würde, aber sie sollte funktionieren).

Wählen Sie ein Zeichen aus, von dem Sie wissen, dass es in Ihrem test.type nicht vorkommt, verwenden Sie es als Trennzeichen, stecken Sie es alle in eine lange Zeichenfolge und suchen Sie Folgendes:

if ("/itema/itemb/itemc/itemd/".indexOf("/"+test.type+"/")>=0) {
  // doSomething
}

Wenn Ihre Zeichenfolgen weiter eingeschränkt sind, können Sie sogar die Trennzeichen weglassen ...

if ("itemaitembitemcitemd".indexOf(test.type)>=0) {
  // doSomething
}

... aber Sie müssten in diesem Fall auf Fehlalarme achten (zB würde "einbetten" in dieser Version übereinstimmen)

CupawnTae
quelle
2

Erstellen Sie zur besseren Lesbarkeit eine Funktion für den Test (ja, eine einzeilige Funktion):

function isTypeDefined(test) {
    return test.type == 'itema' ||
           test.type == 'itemb' ||
           test.type == 'itemc' ||
           test.type == 'itemd';
}

dann nenne es:


    if (isTypeDefined(test)) {

}
...
zaph
quelle
1

Ich denke, es gibt zwei Ziele beim Schreiben dieser Art von if-Bedingung.

  1. Kürze
  2. Lesbarkeit

Als solches mag # 1 manchmal die schnellste sein, aber ich werde später # 2 für eine einfache Wartung nehmen. Je nach Szenario entscheide ich mich oft für eine Variation von Walters Antwort.

Zu Beginn habe ich eine global verfügbare Funktion als Teil meiner vorhandenen Bibliothek.

function isDefined(obj){
  return (typeof(obj) != 'undefined');
}

und wenn ich dann tatsächlich eine if-Bedingung ausführen möchte, die Ihrer ähnlich ist, würde ich ein Objekt mit einer Liste der gültigen Werte erstellen:

var validOptions = {
  "itema":1,
  "itemb":1,
  "itemc":1,
  "itemd":1
};
if(isDefined(validOptions[test.type])){
  //do something...
}

Es ist nicht so schnell wie eine switch / case-Anweisung und etwas ausführlicher als einige der anderen Beispiele, aber ich werde das Objekt häufig an anderer Stelle im Code wiederverwenden, was sehr praktisch sein kann.

Huckepack auf einem der oben hergestellten jsperf-Beispiele Ich habe diesen Test und eine Variation hinzugefügt, um die Geschwindigkeiten zu vergleichen. http://jsperf.com/if-statements-test-techsin/6 Das Interessanteste, was ich bemerkt habe, ist, dass bestimmte Testkombinationen in Firefox viel schneller sind als sogar Chrome.

scunliffe
quelle
1

Dies kann mit einer einfachen for-Schleife gelöst werden:

test = {};
test.type = 'itema';

for(var i=['itema','itemb','itemc']; i[0]==test.type && [
    (function() {
        // do something
        console.log('matched!');
    })()
]; i.shift());

Wir verwenden den ersten Abschnitt der for-Schleife, um die Argumente zu initialisieren, mit denen Sie übereinstimmen möchten, den zweiten Abschnitt, um die Ausführung der for-Schleife zu stoppen, und den dritten Abschnitt, um zu bewirken, dass die Schleife schließlich beendet wird.


quelle