¿Cuál es la forma más bonita de comparar un valor con varios valores? [duplicar]

Resuelto thelastshadow asked hace 12 años • 8 respuestas

¿ Cuál es la forma más bonita de comparar un valor con múltiples opciones?

Sé que hay muchas formas de hacer esto, pero estoy buscando la más sencilla.

Lo pregunto porque esperaba que esto fuera viable (no lo es, obviamente cuando lo miras):

if (foobar == (foo||bar) ) {
     //do something
}
thelastshadow avatar Feb 03 '12 06:02 thelastshadow
Aceptado

No intentes ser demasiado astuto, especialmente cuando eso afecta innecesariamente el rendimiento. Si realmente tienes un montón de comparaciones que hacer, simplemente formatéalo bien.

if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}
david avatar Feb 02 '2012 23:02 david

Lo que suelo hacer es poner esos valores múltiples en una matriz como

var options = [foo, bar];

y luego, use indexOf()

if(options.indexOf(foobar) > -1){
   //do something
}

por la belleza:

if([foo, bar].indexOf(foobar) +1){
   //you can't get any more pretty than this :)
}

y para los navegadores más antiguos:
( https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/IndexOf )

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
        "use strict";
        if (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) { // shortcut for verifying if it's NaN
                n = 0;
            } else if (n != 0 && n != Infinity && n != -Infinity) {
                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;
    }
}
André Alçada Padez avatar Feb 02 '2012 23:02 André Alçada Padez

Como nadie ha agregado todavía la solución obvia que funciona bien para dos comparaciones, la ofreceré:

if (foobar === foo || foobar === bar) {
     //do something
}

Y, si tiene muchos valores (quizás cientos o miles), le sugiero crear un Set, ya que genera un código de comparación muy limpio y simple, y es rápido en tiempo de ejecución:

// pre-construct the Set
var tSet = new Set(["foo", "bar", "test1", "test2", "test3", ...]);

// test the Set at runtime
if (tSet.has(foobar)) {
    // do something
}

Para versiones anteriores a ES6, puede obtener un conjunto de polirellenos de los cuales hay muchos. Uno se describe en esta otra respuesta .

jfriend00 avatar Feb 02 '2012 23:02 jfriend00

Puedes usar un interruptor:

switch (foobar) {
  case foo:
  case bar:
    // do something
}
Guffa avatar Feb 02 '2012 23:02 Guffa