JavaScript: Einfache Möglichkeit zu prüfen, ob die Variable gleich einem von zwei oder mehr Werten ist? [duplicate]

Lesezeit: 4 Minuten

Benutzer-Avatar
Adam Templeton

Gibt es eine einfachere Möglichkeit, festzustellen, ob eine Variable einem Wertebereich entspricht, z. B.:

if x === 5 || 6 

anstatt etwas stumpfes wie:

if x === 5 || x === 6

?

  • Warum halten Sie letzteres für stumpf?

    – Alnitak

    24. August 2012 um 20:42 Uhr

  • Weil ich einen Code schreiben muss, der prüft, ob eine Variable einen von 20 Werten hat, nämlich wenn x = “New York” || “Austin” || “Albert” usw.

    – Adam Templeton

    24. August 2012 um 20:56 Uhr

  • @AdamTempleton: Geben Sie entweder alle Ihre Werte in ein Array ein und verwenden Sie sie dann indexOfoder Sie können auch eine Regex verwenden /^(New York|Austin|Alberta)$/.test(x).

    – João Silva

    24. August 2012 um 21:02 Uhr

  • @AdamTempleton In diesem Fall sollten Sie Ihre Frage umschreiben, um dies zu sagen. Sie sagen ausdrücklich zwei im Betreff.

    – Alnitak

    24. August 2012 um 22:32 Uhr

  • Benutze s = new Set([5, 6]); s.has(x);. Ich bin mir nicht sicher, warum ich diese Frage nicht beantworten kann.

    – Denly

    9. Januar 2018 um 6:27 Uhr

Benutzer-Avatar
Yoshi

Sie können Ihre Werte in einem Array speichern und mit überprüfen, ob die Variable im Array vorhanden ist [].indexOf:

if([5, 6].indexOf(x) > -1) {
  // ...
}

Wenn -1 zurückgegeben wird, existiert die Variable nicht im Array.

  • Dies funktioniert nicht in IE < 9. Siehe Abschnitt Array#indexOf Compatibility von MDN für Code, den Sie einfügen können, damit er tatsächlich im IE funktioniert. Wenn Sie dies jedoch nicht an mehreren Stellen verwenden, wäre es wahrscheinlich schneller, es einfach zu verwenden a == 1 || a == 2.

    – Reid

    24. August 2012 um 21:55 Uhr


  • Wenn Sie alternativ ein JS-Framework verwenden, stellen sowohl MooTools als auch Prototype sicher, dass Array#indexOf vorhanden ist. jQuery hingegen stellt eine eigene Implementierung in Form von bereit $.inArray. Ich kenne keine anderen Frameworks, aber ich bin mir sicher, dass sie alle solche Funktionen in irgendeiner Weise enthalten.

    – Reid

    24. August 2012 um 22:00 Uhr


  • Etwas mehr Beschreibung des Codes wäre schön gewesen.

    – Julix

    14. Oktober 2016 um 0:38 Uhr

  • Und jetzt haben wir dh ['a','b'].includes('a')

    – Devmaleeq

    26. Juli 2021 um 8:03 Uhr


Benutzer-Avatar
zzzzov

Hängt davon ab, welche Art von Test Sie durchführen. Wenn Sie statische Zeichenfolgen haben, können Sie dies sehr einfach über reguläre Ausdrücke überprüfen:

if (/^[56ab]$/.test(item)) {
//-or-
if (/^(foo|bar|baz|fizz|buzz)$/.test(item)) {
    doStuff();
} else {
    doOtherStuff();
}

Wenn Sie einen kleinen Satz von Werten haben (String oder Zahl), können Sie a verwenden switch:

switch (item) {
case 1:
case 2:
case 3:
    doStuff();
    break;
default:
    doOtherStuff();
    break;
}

Wenn Sie eine lange Liste von Werten haben, sollten Sie wahrscheinlich ein Array mit verwenden ~arr.indexOf(item)oder arr.contains(item):

vals = [1,3,18,3902,...];
if (~vals.indexOf(item)) {
    doStuff();
} else {
    doOtherStuff();
}

Leider Array.prototype.indexOf wird in einigen Browsern nicht unterstützt. Glücklicherweise ein Polyfill ist verfügbar. Wenn Sie sich die Mühe machen, Polyfilling durchzuführen Array.prototype.indexOfkönnten Sie genauso gut hinzufügen Array.prototype.contains.

Je nachdem, wie Sie Daten verknüpfen, können Sie eine dynamische Liste von Zeichenfolgen in einem Objekt als Zuordnung zu anderen relevanten Informationen speichern:

var map = {
    foo: bar,
    fizz: buzz
}
if (item in map) {
//-or-
if (map.hasOwnProperty(item)) {
    doStuff(map[item]);
} else {
    doOtherStuff();
}

in wird dabei die gesamte Prototypenkette prüfen Object.prototype.hasOwnProperty wird nur das Objekt überprüfen, seien Sie sich also bewusst, dass sie unterschiedlich sind.

Es ist vollkommen in Ordnung. Wenn Sie eine längere Werteliste haben, können Sie stattdessen vielleicht Folgendes verwenden:

if ([5,6,7,8].indexOf(x) > -1) {
}

Ja. Sie können Ihre eigene Funktion verwenden. Dieses Beispiel verwendet .some:

var foo = [ 5, 6 ].some(function(val) {
     return val === x;
   });

foo; // true

Für die Verwendung habe ich mich entschieden:

Object.prototype.isin = function() {
    for(var i = arguments.length; i--;) {
        var a = arguments[i];
        if(a.constructor === Array) {
            for(var j = a.length; j--;)
                if(a[j] == this) return true;
        }
        else if(a == this) return true;
    }
    return false;
}

Sie würden es wie folgt verwenden:

var fav   = 'pear',
    fruit = ['apple', 'banana', 'orange', 'pear'],
    plu   = [4152, 4231, 3030, 4409];

if (fav.isin(fruit, plu, 'eggs', 'cheese')) {
    //do something cool
}

Die Vorteile sind:

  • es funktioniert in IE < 9;
  • es liest sich natürlich von links nach rechts;
  • Sie können es mit Arrays oder separaten Werten füttern.

Wenn Sie keine Zwangsmaßnahmen zulassen möchten (indexOf nicht), ändern Sie die beiden == zu ===. So wie es steht:

fav = "4231";
plu.indexOf(fav) //-1
fav.isin(plu)    //true

Benutzer-Avatar
Orlp

Nein, es könnte ein paar Tricks geben, die fallspezifisch sind, aber im Allgemeinen schreibe ich Code wie diesen:

if (someVariable === 1 ||
    someVariable === 2 ||
    someVariable === 7 ||
    someVariable === 12 ||
    someVariable === 14 ||
    someVariable === 19) {

    doStuff();
    moreStuff();

} else {
    differentStuff();
}

Benutzer-Avatar
monitorjbl

Die einfache Antwort ist nein. Sie können eine switch-Anweisung verwenden, die einfacher zu lesen ist, wenn Sie viele Zeichenfolgenwerte vergleichen, aber die Verwendung für zwei Werte würde nicht besser aussehen.

1015420cookie-checkJavaScript: Einfache Möglichkeit zu prüfen, ob die Variable gleich einem von zwei oder mehr Werten ist? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy