web-dev-qa-db-fra.com

JavaScript: moyen simple de vérifier si la variable est égale à deux valeurs ou plus?

Existe-t-il un moyen plus facile de déterminer si une variable est égale à une plage de valeurs, telles que:

if x === 5 || 6 

plutôt que quelque chose d'obtus comme:

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

?

36
Adam Templeton

Vous pouvez cacher vos valeurs dans un tableau et vérifier si la variable existe dans le tableau en utilisant [].indexOf :

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

Si -1 est renvoyé, la variable n'existe pas dans le tableau.

67
Yoshi

Cela dépend du type de test que vous effectuez. Si vous avez des chaînes statiques, il est très facile de vérifier cela à l'aide d'expressions régulières:

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

Si vous avez un petit ensemble de valeurs (chaîne ou nombre), vous pouvez utiliser une variable switch:

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

Si vous avez une longue liste de valeurs, vous devriez probablement utiliser un tableau avec ~arr.indexOf(item) , ou arr.contains(item):

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

Malheureusement, Array.prototype.indexOf n'est pas supporté par certains navigateurs. Heureusement un polyfill est disponible . Si vous avez des problèmes avec le remplissage de Array.prototype.indexOf, vous pouvez également ajouter Array.prototype.contains.

Selon la manière dont vous associez les données, vous pouvez stocker une liste dynamique de chaînes dans un objet sous forme de mappage avec d'autres informations pertinentes:

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

in vérifiera la totalité de la chaîne de prototypes tandis que Object.prototype.hasOwnProperty ne vérifiera que l’objet, alors sachez qu’ils sont différents.

23
zzzzBov

C'est parfaitement bien. Si vous avez une liste de valeurs plus longue, vous pouvez peut-être utiliser ce qui suit:

if ([5,6,7,8].indexOf(x) > -1) {
}
16
João Silva

Oui. Vous pouvez utiliser votre propre fonction. Cet exemple utilise .some :

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

foo; // true
7
0x499602D2

C'est ce que j'ai décidé d'utiliser:

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;
}

Vous l'utiliseriez comme ceci:

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

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

Les avantages sont:

  • cela fonctionne dans IE <9;
  • il se lit naturellement de gauche à droite;
  • vous pouvez alimenter des tableaux ou des valeurs séparées.

Si vous ne souhaitez pas autoriser la contrainte de type (indexOf ne le permet pas), remplacez les deux == par ===. Tel qu'il est:

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

non, il peut y avoir quelques astuces qui sont spécifiques à la casse, mais en général, j'écris un code comme celui-ci:

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

    doStuff();
    moreStuff();

} else {
    differentStuff();
}
0
ckozl