Existe uma maneira de escrever isso em menos linhas, mas ainda facilmente legível?
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
fonte
fonte
Respostas:
Defina uma matriz e obtenha pelo índice.
fonte
mm - 1
você também pode definirundefined
como o primeiro valor (índice 0) para que os índices da matriz correspondam aos números dos mesesvar month = month[(mm -1) % 12]
mm-1
issomonths.length==12
.[undefined, 'January', 'February', ...]
- acho que sua primeira reação é WTF ?! , o que geralmente não é um bom sinal ...que tal não usar array :)
de acordo com esta resposta Obtenha o nome do mês de Data de David Storey
fonte
new Date("2009-11-10")
formato tem garantia de análise (consulte esta especificação: ecma-international.org/publications/standards/Ecma-262.htm ). Outros formatos de data (incluindo um em sua resposta) podem ser analisados se o navegador assim escolher e, portanto, não são portáteis.Experimente isto:
Observe que
mm
pode ser um número inteiro ou uma string e ainda funcionará.Se você quiser que chaves inexistentes resultem em uma string vazia
''
(em vez deundefined
), adicione esta linha:JSFiddle .
fonte
var months = Object.freeze({'1': 'January', '2': 'February'}); //etc
See Enums in JavaScript?Você pode criar uma matriz e procurar o nome do mês:
Veja a resposta de @CupawnTae para o raciocínio por trás do código
|| ''
fonte
undefined
em0
comovar months = [ undefined, 'January','February','March', .....
Desta forma, você vai usarmonth = months[mm];
Seja cuidadoso!
O que deve disparar imediatamente o alarme é a primeira linha:
var month = '';
- por que essa variável está sendo inicializada com uma string vazia, em vez denull
ouundefined
? Pode ter sido apenas um hábito ou código copiado / colado, mas a menos que você saiba com certeza, não é seguro ignorá-lo quando estiver refatorando o código.Se você usar uma matriz de nomes de meses e alterar seu código para,
var month = months[mm-1];
você está mudando o comportamento, porque agora para números fora do intervalo, ou valores não numéricos,month
estarãoundefined
. Você pode saber que isso é ok, mas existem muitas situações em que isso seria ruim.Por exemplo, digamos que você
switch
esteja em uma funçãomonthToName(mm)
e alguém a esteja chamando assim:Agora, se você mudar para usar uma matriz e retornar
monthName[mm-1]
, o código de chamada não funcionará mais como pretendido e enviaráundefined
valores quando for para exibir um aviso. Não estou dizendo que este é um bom código, mas a menos que você saiba exatamente como o código está sendo usado, você não pode fazer suposições.Ou talvez a inicialização original estivesse lá porque algum código mais abaixo na linha assume que
month
sempre será uma string e faz algo comomonth.length
- isso resultará em uma exceção sendo lançada para meses inválidos e potencialmente matar o script de chamada completamente.Se você fazer conhecer todo o contexto - por exemplo, é tudo seu próprio código, e mais ninguém nunca vai usá-lo, e você confiar em si mesmo não se esqueça que você fez a algum mudança no futuro - pode ser seguro para alterar o comportamento assim, mas muitos bugs vêm desse tipo de suposição de que na vida real é muito melhor programar defensivamente e / ou documentar o comportamento por completo.
A resposta de Wasmoo acertou (EDITAR: várias outras respostas, incluindo a aceita, também foram corrigidas) - você pode usar
months[mm-1] || ''
ou, se preferir, deixar mais óbvio o que está acontecendo, algo como:fonte
undefined
? Isso economiza desempenho se o tipo for convertido?undefined
quando a entrada não foi 't1..12
. Exceto em circunstâncias muito excepcionais, o comportamento correto sempre supera o desempenho.Para completar, gostaria de complementar as respostas atuais. Basicamente, você pode omitir a
break
palavra - chave e retornar diretamente um valor apropriado. Essa tática é útil se o valor não puder ser armazenado em uma tabela de consulta pré-computada.Mais uma vez, usar uma tabela de consulta ou funções de data é mais sucinto e subjetivamente melhor .
fonte
Você pode fazer isso usando uma matriz:
fonte
Aqui está outra opção que usa apenas 1 variável e ainda aplica o valor padrão
''
quandomm
está fora do intervalo.fonte
Você pode escrevê-lo como uma expressão em vez de um switch, usando operadores condicionais:
Se você não viu operadores condicionais encadeados antes, pode parecer mais difícil de ler no início. Escrevê-lo como uma expressão torna um aspecto ainda mais fácil de ver do que o código original; é claro que a intenção do código é atribuir um valor à variável
month
.fonte
Com base na resposta de Cupawn Tae anterior, eu encurtaria para:
Como alternativa, sim, agradeço, menos legível:
fonte
(!!months[mm - 1])
e simplesmente fazermonths[mm - 1]
.months[mm - 1]
retornaráundefined
para um índice que está fora do intervalo. Comoundefined
é falso, você acabará com''
o valor demonth
.var month = months[mm - 1] || '';
fonte
Como @vidriduch, gostaria de sublinhar a importância de i20y ("internacionalização") do código no contexto atual e sugerir a seguinte solução concisa e robusta em conjunto com o teste unitário.
Tento ficar o mais próximo possível da questão original, ou seja, transformar os números de 1 a 12 em nomes de meses, não apenas para um caso especial, mas retornar
undefined
em caso de argumentos inválidos, usando algumas das críticas anteriormente adicionadas e conteúdos de outras respostas. (A mudança deundefined
para''
é trivial, caso a correspondência exata seja necessária.)fonte
Eu escolheria a solução do wasmoo , mas ajustaria assim:
É exatamente o mesmo código, na verdade, mas recuado de forma diferente, o que o IMO o torna mais legível.
fonte