Estaba mirando stackoverflow cuando he encontrado la pregunta que da nombre a esta entrada, me ha encantando ver que tanta gente añade sus propuestas y hay tantas que no me he podido resistir las ganas de compartir esto con vosotros.
NOTA: Los créditos de toda la entrada se van a stackoverflow y a sus respectivos usuarios.
Imaginemos que tenemos un condicional largo como el siguiente:
if (value == 1 || value == 16 || value == -500 || value == 42.42 || value == 'something' ) {
// blah blah blah
}
Y queremos acortarlo para que nos sea más fácil de mantener y gestionar, bien, a continuación varias formas de tratar ese condicional de una forma un poco alternativa:
Primera opción (no compatible con IE)
var a = [1, 16, -500, 42.42, 'something'];
var value = true;
if (a.indexOf(testVar) > -1){
// blah blah blah
}
Lo que hace es utilizar la función indexOf de Array, la cual nos retorna la posición del elemento que estemos buscando, si el array no contiene lo que buscamos devuelve -1. Podéis obtener más información del siguiente enlace: pulsa aquí.
Basicamente la mejora sería implementar un indexOf manualmente.
Object.prototype.in = function(){
for(var i = 0; i < arguments.length; i++){
if (this == arguments[i]) return true;
}
return false;
}
if (value.in(1, 16, -500, 42.42, 'something')){
// blah blah blah
}
Otra alternativa menos sofisticada, el mítico switch:
switch (value) {
case 1 :
case 16 :
case -500 :
case 42.42:
case 'something'
//código
break;
}
Basicamente es como el if pero a lo vertical.
Otra opción será creando un objeto, y luego accediendo directamente al indice del mismo:
var accept = { 1: true, 16: true, '-500': true, 42.42: true, something: true }; //mas corto cambiando el true por un 1
if (accept[value]) {
// blah blah blah
}
Sinceramente esta me parece una idea muy original, pero menos practica que las otras.
Pues listos, 3 métodos alternativos para comprobar si un array contiene un elemento dado.
… por cierto 3 no son tantas :P