174 votes

Vérifier l'égalité d'une variable par rapport à une liste de valeurs

Je vérifie une variable, disons foo pour l'égalité à un certain nombre de valeurs. Par exemple,

if( foo == 1 || foo == 3 || foo == 12 ) {
    // ...
}

Le fait est qu'il s'agit d'un code assez volumineux pour une tâche aussi triviale. J'ai trouvé ce qui suit :

if( foo in {1: 1, 3: 1, 12: 1} ) {
    // ...
}

mais cela ne me plaît pas du tout, car je dois donner des valeurs redondantes aux éléments de l'objet.

Quelqu'un connaît-il un moyen décent de vérifier l'égalité de plusieurs valeurs ?

7voto

Elian Ebbing Points 8363

Vous pouvez écrire if(foo in L(10,20,30)) si vous définissez L être

var L = function()
{
    var obj = {};
    for(var i=0; i<arguments.length; i++)
        obj[arguments[i]] = null;

    return obj;
};

6voto

meder Points 81864
var a = [1,2,3];

if ( a.indexOf( 1 ) !== -1 ) { }

Notez que indexOf ne fait pas partie du noyau ECMAScript. Vous aurez besoin d'un extrait pour IE et éventuellement d'autres navigateurs qui ne supportent pas Array.prototype.indexOf.

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(searchElement /*, fromIndex */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (len === 0)
      return -1;

    var n = 0;
    if (arguments.length > 0)
    {
      n = Number(arguments[1]);
      if (n !== n)
        n = 0;
      else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))
        n = (n > 0 || -1) * Math.floor(Math.abs(n));
    }

    if (n >= len)
      return -1;

    var k = n >= 0
          ? n
          : Math.max(len - Math.abs(n), 0);

    for (; k < len; k++)
    {
      if (k in t && t[k] === searchElement)
        return k;
    }
    return -1;
  };
}

3voto

ivan.sivak Points 346

De plus, comme les valeurs contre lesquelles vous vérifiez le résultat sont toutes uniques, vous pouvez utiliser la fonction Set.prototype.has() également.

var valid = [1, 3, 12];
var goodFoo = 3;
var badFoo = 55;

// Test
console.log( new Set(valid).has(goodFoo) );
console.log( new Set(valid).has(badFoo) );

1voto

Greg Perham Points 383

J'ai aimé la réponse acceptée, mais j'ai pensé qu'il serait intéressant de lui permettre de prendre également en charge des tableaux, et je l'ai donc développée comme suit :

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

var lucky = 7,
    more = [7, 11, 42];
lucky.isin(2, 3, 5, 8, more) //true

Vous pouvez supprimer la coercition de type en modifiant == à === .

1voto

David Salamon Points 1309

Si vous avez accès à Underscore, vous pouvez utiliser ce qui suit :

if (_.contains([1, 3, 12], foo)) {
  // ...
}

contains fonctionnait également dans Lodash (avant la V4), mais il faut maintenant utiliser includes

if (_.includes([1, 3, 12], foo)) {
  handleYellowFruit();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X