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.
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.
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.
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.
Su primera línea devuelve verdadero para una cadena que solo contiene una de esas palabras. "asdfz" activaría el condicional, por ejemplo. – erjiang
@mazin, sí, de hecho agregué el ancla faltante antes de ver tu comentario. –
+1 para 'indexOf', -1 para usar regexp. : P niño, niño, +1 de mí. –
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)
Matthew Flaschen's es mejor. – Anthony
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. –
@Nick - Por supuesto, "costo muy bajo" es un término relativo. – ChaosPandion
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
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]) {
...
}
Creo que esto funcionaría bastante bien. – ChaosPandion
Honestamente, creo que esto es menos legible que simplemente escribir condicionales, y no creo que sea más rápido escribir. –
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
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.
Invertiría el sentido de la prueba, por ejemplo: String.prototype.hasToken = function (token) {return this.split (/ \ s + /). IndexOf (token)! = -1; }. –
Ternary operator se ve bien si le gusta y tiene otra cosa
eso es lo que estaba buscando! ¡así es como se llama! –
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
Tu segundo puede acortarse a "if (true)", no puede ser fgfg y asdf al mismo tiempo :) –
Whoops lol, qué estaba haciendo, no importa el segundo. – Mark