Si puedo decir:

var big = (x > 10) ? true : false;

En lugar de:

var big;
if (x > 10) {
    big = true;
}
else {
    big = false;
}

¿Cómo hago esto similarmente más corta?

var now = new Date

if (now.getHours() < 5) {
    return "late night pick me up";
}
else if (now.getHours() < 9) {
    return "breakfast";
}
else if (now.getHours() < 13) {
    return "lunch";
}
else if (now.getHours() < 17) {
    return "afternoon snak";
}
else {
    return "dinner";
}

¡Muchas gracias!

4
Ali Habibzadeh 20 may. 2011 a las 19:50

9 respuestas

La mejor respuesta

No puede, sin un montón de operadores ternarios anidados desordenados. El operador ternario solo es bueno para un revestimiento.

4
Rafe Kettler 20 may. 2011 a las 15:54

Se verá bastante desordenado:

return ((now.getHours() < 5)?"late night pick me up":
         ((now.getHours() < 9)?"breakfast":
            ((now.getHours() < 13)?"lunch":
               ((now.getHours() < 17)?"afternoon snack":
                  "dinner"
               )
            )
          )
       );

Debes recordar hacer coincidir los paréntesis.

1
Naftali aka Neal 20 may. 2011 a las 16:02

Primero, intente var big = x > 10; en lugar de var big = (x > 10) ? true : false;

En segundo lugar, no necesita if-else cuando regrese.

//looks  a little confusing, but you can move the return to line after ifs
var now = new Date  
if (now.getHours() < 5)  return "late night pick me up"; 
if (now.getHours() < 9)  return "breakfast";
if (now.getHours() < 13) return "lunch";
if (now.getHours() < 17) return "afternoon snak";
return "dinner"; 
2
Praveen Lobo 20 may. 2011 a las 16:05

Me topé con esto en busca de algo más. Aquí hay un pequeño truco de taquigrafía usando operadores lógicos y abusando del hecho de que los literales de cadena son verdaderos =]

var hr = new Date().getHours();

return hr < 5 && 'late night pick me up' 
    || hr < 9 && 'breakfast' 
    || hr < 13 && 'lunch' 
    || hr < 17 && 'afternoon snack' 
    || 'dinner';
1
nullable 8 sep. 2012 a las 06:32

Siempre puede usar una tabla para replicar la funcionalidad:

var now = new Date();
var meals = [
    "late night pick me up",
    "breakfast",
    "lunch",
    "afernoon snack",
    "dinner"];
return meals[parseInt(now.getHours()-4)/4];
0
yan 20 may. 2011 a las 16:03
var now = new Date().getHours();

return now < 5 ? "late night pick me up" :
       now < 9 ? "breakfast" :
       now < 13 ? "lunch" :
       now < 17 ? "afternoon snak" : "dinner";
9
Idered 27 feb. 2014 a las 18:49

No puedes abreviar eso en particular, personalmente lo escribiría así:

if (now.getHours() < 5) return "late night pick me up";
else if (now.getHours() < 9) return "breakfast";
else if (now.getHours() < 13) return "lunch";
else if (now.getHours() < 17) return "afternoon snak";
else return "dinner";

Eso no es tan malo, ¿verdad?

3
cusimar9 20 may. 2011 a las 15:54

Probablemente no quieras, ya que podría decirse que sería menos legible. Sin embargo, podría simplemente anidar el operador ternario de esta manera:

var now = (now.getHours() < 5) ? "late night pick me up" : ((now.getHours() < 9) ? "breakfast" : ((now.getHours() < 13) ? "lunch" : ((now.getHours() < 17) ? "afternoon snack" : "dinner")))));

¡Espero que puedas ver por qué no es una buena idea!

Una condición más larga y compleja como esta generalmente necesita varias líneas y una buena separación de bloques para ser fácilmente comprensible, y aunque podría agregarse saltos de línea, los bloques estándar if-else finalmente serán el ganador al expresar claramente su intención.

3
Andrzej Doyle 20 may. 2011 a las 15:54

Siempre puede usar una declaración de cambio:

switch(true)
{
case (now.getHours() < 5):
  return "late night pick me up";
  break;
case (now.getHours() < 9):
  return "breakfast";
  break;  //etc...
default:
  return "dinner";
}
1
Kyle 20 may. 2011 a las 16:19