Existe-t-il un moyen d'écrire ceci sur moins de lignes, mais toujours facilement lisible?
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
Léon Gaban
la source
la source
Réponses:
Définissez un tableau, puis obtenez par index.
la source
mm - 1
vous pouvez également définirundefined
comme première valeur (index 0) afin que les indices du tableau correspondent aux numéros de moisvar month = month[(mm -1) % 12]
mm-1
, donc çamonths.length==12
.[undefined, 'January', 'February', ...]
- je préfère que votre première réaction soit WTF?! , ce qui n'est généralement pas bon signe ...et ne pas utiliser du tout array :)
selon cette réponse Obtenir le nom du mois de Date de David Storey
la source
new Date("2009-11-10")
format est garanti pour être analysé (voir cette spécification : ecma-international.org/publications/standards/Ecma-262.htm ). D'autres formats de date (dont un dans votre réponse) peuvent être analysés si le navigateur le souhaite, et ne sont donc pas portables.Essaye ça:
Notez que cela
mm
peut être un entier ou une chaîne et cela fonctionnera toujours.Si vous voulez que les clés non existantes entraînent une chaîne vide
''
(au lieu deundefined
), ajoutez cette ligne:JSFiddle .
la source
var months = Object.freeze({'1': 'January', '2': 'February'}); //etc
See Enums en JavaScript?Vous pouvez créer un tableau à la place et rechercher le nom du mois:
Voir la réponse de @CupawnTae pour le rationnel derrière le code
|| ''
la source
undefined
à0
commevar months = [ undefined, 'January','February','March', .....
cette façon vous utiliserezmonth = months[mm];
Faites attention!
La chose qui devrait immédiatement déclencher des sonneries d'alarme est la première ligne:
var month = '';
- pourquoi cette variable est-elle initialisée à une chaîne vide, plutôt quenull
ouundefined
? Il peut s'agir simplement d'une habitude ou d'un copier / coller de code, mais à moins que vous ne le sachiez avec certitude, il n'est pas prudent de l'ignorer lorsque vous refactorisez du code.Si vous utilisez un tableau de noms de mois et que vous modifiez votre code,
var month = months[mm-1];
vous modifiez le comportement, car maintenant pour les nombres en dehors de la plage, ou les valeurs non numériques,month
seraundefined
. Vous savez peut-être que c'est correct, mais il y a de nombreuses situations où ce serait mauvais.Par exemple, disons que vous
switch
êtes dans une fonctionmonthToName(mm)
et que quelqu'un appelle votre fonction comme ceci:Maintenant, si vous passez à l'utilisation d'un tableau et au retour
monthName[mm-1]
, le code d'appel ne fonctionnera plus comme prévu et il soumettra desundefined
valeurs lorsqu'il est censé afficher un avertissement. Je ne dis pas que c'est un bon code, mais à moins que vous ne sachiez exactement comment le code est utilisé, vous ne pouvez pas faire d'hypothèses.Ou peut-être que l'initialisation d'origine était là parce que du code plus loin dans la ligne suppose que ce
month
sera toujours une chaîne et fait quelque chose commemonth.length
- cela entraînera la levée d'une exception pour des mois invalides et potentiellement tuera complètement le script appelant.Si vous ne connaissez tout le contexte - par exemple , il est tout votre propre code, et personne d'autre ne va jamais l' utiliser, et vous vous croyez ne pas oublier que vous avez fait le quelque temps de changement dans l'avenir - il peut être sûr de changer le comportement comme ça, mais tellement de bogues proviennent de ce genre d'hypothèse que dans la vraie vie, il vaut mieux programmer de manière défensive et / ou documenter le comportement à fond.
La réponse de Wasmoo est correcte (EDIT: un certain nombre d'autres réponses, y compris celle acceptée, ont maintenant été corrigées) - vous pouvez utiliser
months[mm-1] || ''
ou si vous préférez rendre plus évident en un coup d'œil ce qui se passe, quelque chose comme:la source
undefined
? Cela économise-t-il les performances si le type est converti?undefined
lorsque l'entrée n'était pas 't1..12
. Sauf dans des circonstances très exceptionnelles, un comportement correct l'emporte à chaque fois sur les performances.Par souci d'exhaustivité, j'aimerais compléter les réponses actuelles. Fondamentalement, vous pouvez ignorer le
break
mot - clé et renvoyer directement une valeur appropriée. Cette tactique est utile si la valeur ne peut pas être stockée dans une table de recherche précalculée.Encore une fois, utiliser une table de consultation ou des fonctions de date est plus succinct et subjectivement meilleur .
la source
Vous pouvez le faire en utilisant un tableau:
la source
Voici une autre option qui n'utilise qu'une seule variable et applique toujours la valeur par défaut
''
lorsqu'ellemm
est en dehors de la plage.la source
Vous pouvez l'écrire comme une expression au lieu d'un commutateur, en utilisant des opérateurs conditionnels:
Si vous n'avez pas vu d'opérateurs conditionnels chaînés auparavant, cela peut sembler plus difficile à lire au début. L'écrire comme une expression rend un aspect encore plus facile à voir que le code original; il est clair que l'intention du code est d'attribuer une valeur à la variable
month
.la source
En m'appuyant sur la réponse de Cupawn Tae, je la raccourcirais à:
Alternativement, oui, j'apprécie, moins lisible:
la source
(!!months[mm - 1])
et faire simplementmonths[mm - 1]
.months[mm - 1]
retourneraundefined
pour un index hors de portée. Puisqueundefined
c'est faux, vous vous retrouverez avec''
la valeur demonth
.var month = months[mm - 1] || '';
la source
Comme @vidriduch, je voudrais souligner l'importance d'i20y ("internationalisabilité") du code dans le contexte actuel et suggérer la solution concise et robuste suivante avec le test unitaire.
J'essaie de rester aussi proche que possible de la question originale, c'est-à-dire de transformer les nombres 1 à 12 en noms de mois, non seulement pour un cas particulier, mais de revenir
undefined
en cas d'arguments invalides, en utilisant certaines des critiques précédemment ajoutées et le contenu d'autres réponses. (Le changement deundefined
à''
est trivial, au cas où une correspondance exacte serait nécessaire.)la source
Je choisirais la solution wasmoo , mais ajustez-la comme ceci:
C'est exactement le même code, vraiment, mais différemment en retrait, que l'OMI le rend plus lisible.
la source