¿Hay alguna forma de escribir esto en menos líneas, pero que aún sea fácil de leer?
var month = '';
switch(mm) {
case '1':
month = 'January';
break;
case '2':
month = 'February';
break;
case '3':
month = 'March';
break;
case '4':
month = 'April';
break;
case '5':
month = 'May';
break;
case '6':
month = 'June';
break;
case '7':
month = 'July';
break;
case '8':
month = 'August';
break;
case '9':
month = 'September';
break;
case '10':
month = 'October';
break;
case '11':
month = 'November';
break;
case '12':
month = 'December';
break;
}
javascript
date
switch-statement
date-format
Leon Gaban
fuente
fuente
Respuestas:
Defina una matriz, luego obtenga por índice.
fuente
mm - 1
, también puede establecerloundefined
como el primer valor (índice 0) para que los índices de la matriz coincidan con los números de los mesesvar month = month[(mm -1) % 12]
mm-1
esomonths.length==12
.[undefined, 'January', 'February', ...]
. ¿Es mejor que su primera reacción sea WTF? , que generalmente no es una buena señal ...¿qué tal no usar la matriz en absoluto :)
según esta respuesta Obtenga el nombre del mes de la fecha de David Storey
fuente
new Date("2009-11-10")
formato está garantizado para ser analizado (véase este specifiation: ecma-international.org/publications/standards/Ecma-262.htm ). Se pueden analizar otros formatos de fecha (incluido uno en su respuesta) si el navegador así lo elige y, por lo tanto, no son portátiles.Prueba esto:
Tenga en cuenta que
mm
puede ser un número entero o una cadena y seguirá funcionando.Si desea que las claves no existentes den como resultado una cadena vacía
''
(en lugar deundefined
), agregue esta línea:JSFiddle .
fuente
var months = Object.freeze({'1': 'January', '2': 'February'}); //etc
Ver enumeraciones en JavaScript?En su lugar, podría crear una matriz y buscar el nombre del mes:
Vea la respuesta de @CupawnTae para conocer la razón detrás del código
|| ''
fuente
undefined
en0
tanvar months = [ undefined, 'January','February','March', .....
De esta manera va a utilizarmonth = months[mm];
¡Ten cuidado!
Lo que debería activar inmediatamente las alarmas es la primera línea:
var month = '';
- ¿por qué esta variable se inicializa en una cadena vacía, en lugar denull
oundefined
? Puede que haya sido un hábito o un código copiado / pegado, pero a menos que lo sepa con certeza, no es seguro ignorarlo cuando esté refactorizando el código.Si usa una matriz de nombres de meses y cambia su código a
var month = months[mm-1];
, está cambiando el comportamiento, porque ahora para números fuera del rango, o valores no numéricos,month
seránundefined
. Puede que sepa que esto está bien, pero hay muchas situaciones en las que esto sería malo.Por ejemplo, digamos que
switch
está en una funciónmonthToName(mm)
y alguien llama a su función de esta manera:Ahora, si cambia a usar una matriz y regresa
monthName[mm-1]
, el código de llamada ya no funcionará comoundefined
se esperaba y enviará valores cuando se supone que debe mostrar una advertencia. No digo que esto sea bueno código, pero a menos que sepa exactamente cómo se usa el código, no puede hacer suposiciones.O tal vez la inicialización original estaba allí porque algún código más adelante en la línea asume que
month
siempre será una cadena, y hace algo comomonth.length
: esto resultará en una excepción para meses inválidos y potencialmente matará el script de llamada por completo.Si haces saber todo el contexto - por ejemplo, que es todo su propio código, y nadie más es cada vez va a utilizarlo, y confiar en sí mismos no olvidemos que hizo el algún cambio en el futuro - puede ser seguro para cambiar el comportamiento como este, pero muchos errores provienen de este tipo de suposición de que en la vida real es mucho mejor programar a la defensiva y / o documentar el comportamiento a fondo.
La respuesta de Wasmoo lo hace bien (EDITAR: varias otras respuestas, incluida la aceptada, ahora también se han solucionado) : puede usar
months[mm-1] || ''
o si prefiere que sea más obvio de un vistazo lo que está sucediendo, algo como:fuente
undefined
? ¿Eso ahorra rendimiento si el tipo se convierte?undefined
cuando la entrada no era 't1..12
. Excepto en circunstancias muy excepcionales, el comportamiento correcto siempre triunfa sobre el rendimiento.Para completar, me gustaría complementar las respuestas actuales. Básicamente, puede omitir la
break
palabra clave y devolver directamente un valor apropiado. Esta táctica es útil si el valor no se puede almacenar en una tabla de búsqueda precalculada.Una vez más, usar una tabla de consulta o funciones de fecha es más conciso y subjetivamente mejor .
fuente
Podrías hacerlo usando una matriz:
fuente
Aquí hay otra opción que usa solo 1 variable y aún aplica el valor predeterminado
''
cuandomm
está fuera del rango.fuente
Puede escribirlo como una expresión en lugar de un interruptor, usando operadores condicionales:
Si no ha visto operadores condicionales encadenados antes, esto puede parecer más difícil de leer al principio. Escribirlo como una expresión hace que un aspecto sea aún más fácil de ver que el código original; está claro que la intención del código es asignar un valor a la variable
month
.fuente
Sobre la base de la respuesta anterior de Cupawn Tae, la acortaría a:
Alternativamente, sí, lo agradezco, menos legible:
fuente
(!!months[mm - 1])
y simplemente hacermonths[mm - 1]
.months[mm - 1]
volveráundefined
para un índice que está fuera de rango. Dado queundefined
es falso, terminará con''
el valor demonth
.var month = months[mm - 1] || '';
fuente
Como @vidriduch, me gustaría subrayar la importancia de i20y ("internacionalización") del código en el contexto actual y sugerir la siguiente solución concisa y robusta junto con la prueba unitaria.
Intento mantenerme lo más cerca posible de la pregunta original, es decir, transformar los números del 1 al 12 en nombres de meses, no solo para un caso especial, sino también regresar
undefined
en caso de argumentos no válidos, utilizando algunas de las críticas agregadas anteriormente y el contenido de otros respuestas. (El cambio deundefined
a''
es trivial, en caso de que se necesite una coincidencia exacta ).fuente
Yo iría por la solución de wasmoo , pero ajústela así:
Es exactamente el mismo código, en realidad, pero con sangría diferente, lo que IMO lo hace más legible.
fuente