2010-06-21 15 views
5

que tienen los condicionales como este:condicionales más cortos en js

if (foo == 'fgfg' || foo == 'asdf' || foo == 'adsfasdf') { 
// do stuff 

} 

Seguramente hay una manera más rápida de escribir esto?

Gracias.

+1

No ... en realidad no ... Si fue foo == null || foo == indefinido || foo == 0 podría acortarse a if (! foo) ... pero si comparas foo con 3 strings, entonces necesitas 3 comparaciones diferentes. No hay forma de evitarlo – Zoidberg

+1

Tu segundo puede acortarse a "if (true)", no puede ser fgfg y asdf al mismo tiempo :) –

+0

Whoops lol, qué estaba haciendo, no importa el segundo. – Mark

Respuesta

4

Me gustaría mantener los condicionales de la manera que son. Cualquier forma ingeniosa de acortarlos haría que el código fuera menos idiomático y menos legible.

Ahora, si se preocupan por la legibilidad, se puede definir una función para hacer la comparación:

if(foo_satisfies_condition(foo)) { 
    // ... 
} 

O:

if(is_month_name(foo) { 
    // ... 
} 

Si usted le da la función de un nombre que fielmente describe lo si lo hace, será más fácil comprender la intención del código.

Cómo implementar esa función dependerá de cuántas comparaciones necesite. Si tiene una gran cantidad de cadenas con las que está comparando, podría usar un hash. Sin embargo, los detalles de implementación son irrelevantes al leer el código de llamada.

4
if (/^(fgfg|asdf|adsfasdf)$/.test(foo)) { 

o:

if (["fgfg", "asdf", "adsfasdf"].indexOf(foo) != -1) { 

apoyo de la Cruz en navegador para Array.indexOf todavía es limitado. Además, estos son más rápidos de escribir, probablemente no más rápidos de ejecutar.

+0

Su primera línea devuelve verdadero para una cadena que solo contiene una de esas palabras. "asdfz" activaría el condicional, por ejemplo. – erjiang

+0

@mazin, sí, de hecho agregué el ancla faltante antes de ver tu comentario. –

+0

+1 para 'indexOf', -1 para usar regexp. : P niño, niño, +1 de mí. –

0

Dependiendo de la situación que podría hacer ..

 
//At some point in your code 
var vals = new Array('fgfg', 'asdf', 'adsfasdf'); 
//... 
if(vals.indexOf(foo) >= 0) 
+0

Matthew Flaschen's es mejor. – Anthony

+0

Debería verlo en términos de rendimiento también, cuando la lista de opciones crece, el rendimiento de expresiones regulares se va por el desagüe, '.indexOf()' sigue siendo un costo muy bajo, si instancia la matriz una vez que es mejor, por supuesto. –

+0

@Nick - Por supuesto, "costo muy bajo" es un término relativo. – ChaosPandion

6

Usted podría considerar una declaración switch de los casos

switch(foo) { 
    case "fgfg": 
    case "asdf": 
    case "adsfasdf": 
    // ... 
} 

En realidad no es más corto, pero podría ser más legible dependiendo del número de condiciones que usa

4

No hay necesidad de usar indexOf o una expresión regular si sólo utiliza una tabla hash:

var things = { 'fgfg' : 1, 'asdf' : 1, 'asdfasdf' : 1 }; 
if (things[foo]) { 
    ... 
} 
+0

Creo que esto funcionaría bastante bien. – ChaosPandion

+0

Honestamente, creo que esto es menos legible que simplemente escribir condicionales, y no creo que sea más rápido escribir. –

+1

Si crees que es menos legible, seguramente no me gustaría que se te encargue trabajar en tu código. :) Nada me molesta más que ver un condicional enormemente complejo pegado junto con una docena de operadores booleanos cuando una tabla de búsqueda haría las cosas mucho más fáciles. – friedo

1

Aquí está una manera fácil:

String.prototype.testList = function(lst) { 
lst = lst.split('|'); 
for(var i=0; i<lst.length; i++){ 
    if (this == lst[i]) return true; 
} 
return false; 
}; 

Para utilizar esta función, sólo puede hacer esto:

if (foo.testList('fgfg|asdf|adsfasdf')) { 

también puede cambiar el nombre de testList a lo que quieras, y cambiar la del imite desde | a lo que quieras.

+0

Invertiría el sentido de la prueba, por ejemplo: String.prototype.hasToken = function (token) {return this.split (/ \ s + /). IndexOf (token)! = -1; }. –

0

Ternary operator se ve bien si le gusta y tiene otra cosa

+0

eso es lo que estaba buscando! ¡así es como se llama! –