Adakah cara untuk menulis ini dengan lebih sedikit baris, tetapi masih mudah dibaca?
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
sumber
sumber
Jawaban:
Tentukan array, lalu dapatkan dengan indeks.
sumber
mm - 1
Anda juga dapat mengaturundefined
sebagai nilai pertama (indeks 0) sehingga indeks array akan cocok dengan nomor bulanvar month = month[(mm -1) % 12]
mm-1
, jadi itumonths.length==12
.[undefined, 'January', 'February', ...]
- saya yakin reaksi pertama Anda adalah WTF ?! , yang biasanya bukan pertanda baik ...bagaimana jika tidak menggunakan array sama sekali :)
sesuai jawaban ini Dapatkan nama bulan dari Tanggal dari David Storey
sumber
new Date("2009-11-10")
format yang dijamin akan diurai (lihat spesifikasi ini: ecma-international.org/publications/standards/Ecma-262.htm ). Format tanggal lain (termasuk salah satu dalam jawaban Anda) dapat diurai jika browser memilihnya, dan karenanya tidak portabel.Coba ini:
Perhatikan bahwa
mm
bisa berupa integer atau string dan itu akan tetap berfungsi.Jika Anda ingin kunci yang tidak ada menghasilkan string kosong
''
(bukanundefined
), tambahkan baris ini:JSFiddle .
sumber
var months = Object.freeze({'1': 'January', '2': 'February'}); //etc
Lihat Enum di JavaScript?Anda dapat membuat array dan mencari nama bulan:
Lihat jawaban oleh @CupawnTae untuk alasan di balik kode
|| ''
sumber
undefined
di0
sebagaivar months = [ undefined, 'January','February','March', .....
cara ini Anda akan menggunakanmonth = months[mm];
Hati-hati!
Hal yang harus segera memicu lonceng alarm adalah baris pertama:
var month = '';
- mengapa variabel ini diinisialisasi ke string kosong, bukannull
atauundefined
? Ini mungkin hanya kebiasaan atau salin / tempel kode, tetapi kecuali Anda tahu pasti, tidak aman untuk mengabaikannya saat Anda memfaktorkan ulang kode.Jika Anda menggunakan array nama bulan dan mengubah kode
var month = months[mm-1];
Anda, Anda mengubah perilaku, karena sekarang untuk angka di luar rentang, atau nilai non-numerik,month
akanundefined
. Anda mungkin tahu bahwa ini tidak masalah, tetapi ada banyak situasi di mana hal ini akan berdampak buruk.Misalnya, Anda
switch
ada dalam suatu fungsimonthToName(mm)
, dan seseorang memanggil fungsi Anda seperti ini:Sekarang jika Anda mengubah menggunakan array dan mengembalikan
monthName[mm-1]
, kode panggilan tidak akan berfungsi lagi sebagaimana mestinya, dan akan mengirimkanundefined
nilai ketika seharusnya menampilkan peringatan. Saya tidak mengatakan ini adalah kode yang bagus , tetapi kecuali Anda tahu persis bagaimana kode itu digunakan, Anda tidak dapat membuat asumsi.Atau mungkin inisialisasi asli ada di sana karena beberapa kode lebih jauh mengasumsikan bahwa
month
akan selalu berupa string, dan melakukan sesuatu sepertimonth.length
- ini akan menghasilkan pengecualian yang dilemparkan selama beberapa bulan yang tidak valid dan berpotensi mematikan skrip pemanggil sepenuhnya.Jika Anda benar- benar mengetahui konteks keseluruhan - mis. Itu semua adalah kode Anda sendiri, dan tidak ada orang lain yang akan menggunakannya, dan Anda percaya pada diri sendiri tidak lupa Anda membuat perubahan di masa mendatang - mungkin aman untuk mengubah perilaku seperti ini, tapi soooo banyak bug berasal dari asumsi semacam ini bahwa dalam kehidupan nyata Anda jauh lebih baik memprogram secara defensif dan / atau mendokumentasikan perilaku secara menyeluruh.
Jawaban Wasmoo benar (EDIT: sejumlah jawaban lain, termasuk yang diterima, kini telah diperbaiki juga) - Anda dapat menggunakan
months[mm-1] || ''
atau jika Anda lebih suka membuatnya lebih jelas sekilas tentang apa yang terjadi, seperti:sumber
undefined
? Apakah itu menghemat kinerja jika jenisnya dikonversi?undefined
ketika input tidak t1..12
. Kecuali dalam keadaan yang sangat luar biasa, perilaku yang benar selalu mengalahkan kinerja.Untuk kelengkapan, saya ingin melengkapi jawaban saat ini. Pada dasarnya, Anda dapat menghilangkan
break
kata kunci dan langsung mengembalikan nilai yang sesuai. Taktik ini berguna jika nilai tidak dapat disimpan dalam tabel pencarian yang dihitung sebelumnya.Sekali lagi, menggunakan tabel pencarian atau fungsi tanggal lebih ringkas dan lebih baik secara subyektif .
sumber
Anda bisa melakukannya menggunakan array:
sumber
Berikut opsi lain yang hanya menggunakan 1 variabel dan masih menerapkan nilai default
''
saatmm
berada di luar rentang.sumber
Anda bisa menulisnya sebagai ekspresi alih-alih sakelar, menggunakan operator bersyarat:
Jika Anda belum pernah melihat operator bersyarat yang dirantai sebelumnya, ini mungkin tampak lebih sulit untuk dibaca pada awalnya. Menulisnya sebagai ekspresi membuat satu aspek lebih mudah dilihat daripada kode aslinya; jelas bahwa maksud kode adalah untuk memberikan nilai ke variabel
month
.sumber
Berdasarkan jawaban Cupawn Tae sebelumnya, saya akan mempersingkatnya menjadi:
Atau, ya, saya menghargai, kurang terbaca:
sumber
(!!months[mm - 1])
dan melakukannyamonths[mm - 1]
.months[mm - 1]
akan mengembalikanundefined
indeks yang di luar jangkauan. Karenaundefined
falsy Anda akan berakhir dengan''
sebagai nilaimonth
.var month = months[mm - 1] || '';
sumber
Seperti @vidriduch, saya ingin menggarisbawahi pentingnya i20y ("kemampuan internasional") kode dalam konteks saat ini dan menyarankan solusi ringkas dan kuat berikut bersama dengan uji kesatuan.
Saya mencoba untuk sedekat mungkin dengan pertanyaan asli, yaitu mengubah angka 1 menjadi 12 menjadi nama bulan, tidak hanya untuk satu kasus khusus, tetapi kembali
undefined
jika ada argumen yang tidak valid, menggunakan beberapa kritik yang ditambahkan sebelumnya ke dan isi dari yang lain jawaban. (Perubahan dariundefined
menjadi''
sepele, jika diperlukan pencocokan tepat .)sumber
Saya akan mencari solusi wasmoo , tetapi sesuaikan seperti ini:
Ini adalah kode yang persis sama, sungguh, tetapi berlekuk berbeda, yang membuatnya lebih mudah dibaca.
sumber