¿Cuál es la forma más bonita de comparar un valor con varios valores? [duplicar]
¿ 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
}
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
}
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;
}
}
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 .
Puedes usar un interruptor:
switch (foobar) {
case foo:
case bar:
// do something
}