jadi saya ingin menggunakan pernyataan switch seperti ini:
switch (scrollLeft) {
case (<1000):
//do stuff
break;
case (>1000 && <2000):
//do stuff
break;
}
Sekarang saya tahu bahwa salah satu dari pernyataan tersebut ( <1000
) atau ( >1000 && <2000
) tidak akan berfungsi (untuk alasan yang berbeda, jelas). Yang saya tanyakan adalah cara paling efisien untuk melakukan hal itu. Saya benci menggunakan 30 if
pernyataan, jadi saya lebih suka menggunakan sintaks saklar. Adakah yang bisa saya lakukan?
your_mapper_object[scrollLeft / SOME_CONST]
, dengan anggapanyour_mapper_object
seperti itu{1: some_func, 2: another_func, ...}
. Dan dalam hal ini Anda juga bisa menggunakan sakelar.Jawaban:
Ketika saya melihat solusi di jawaban lain saya melihat beberapa hal yang saya tahu buruk untuk kinerja. Saya akan memberi mereka komentar tetapi saya pikir lebih baik untuk membandingkannya dan membagikan hasilnya. Anda bisa mengujinya sendiri . Di bawah ini adalah hasil saya (ymmv) dinormalisasi setelah operasi tercepat di setiap browser (kalikan waktu 1.0 dengan nilai dinormalisasi untuk mendapatkan waktu absolut dalam ms).
Tes di mana dilakukan pada Windows 7 32bit dengan versi berikut: Chrome 21.0.1180.89m , Firefox 15.0 , Opera 12.02 , MSIE 9.0.8112 , Safari 5.1.7 . Node dijalankan pada Linux 64bit box karena resolusi timer pada Node.js untuk Windows adalah 10ms, bukan 1ms.
jika-langsung
Ini adalah yang tercepat di semua lingkungan yang diuji, kecuali di ... drumroll MSIE! (kejutan kejutan). Ini adalah cara yang disarankan untuk mengimplementasikannya.
jika-tidak langsung
Ini adalah varian dari
switch-indirect-array
tetapi dengan-if
pernyataan sebagai gantinya dan berkinerja lebih cepat daripadaswitch-indirect-array
di hampir semua lingkungan yang diuji.beralih-langsung
Ini cukup cepat di semua lingkungan yang diuji, dan sebenarnya yang tercepat di MSIE. Ini berfungsi ketika Anda bisa melakukan perhitungan untuk mendapatkan indeks.
saklar-rentang
Ini sekitar 6 hingga 40 kali lebih lambat daripada yang tercepat di semua lingkungan yang diuji kecuali untuk Opera yang membutuhkan waktu sekitar satu setengah kali. Ini lambat karena mesin harus membandingkan nilai dua kali untuk setiap kasus. Anehnya, Chrome membutuhkan waktu hampir 40 kali lebih lama untuk menyelesaikannya dibandingkan dengan operasi tercepat di Chrome, sedangkan MSIE hanya membutuhkan waktu 6 kali lebih lama. Tetapi perbedaan waktu aktual hanya 74ms mendukung MSIE di 1337ms (!).
saklar-range2
Ini adalah varian
switch-range
tetapi dengan hanya satu perbandingan per case dan karena itu lebih cepat, tetapi masih sangat lambat kecuali di Opera. Urutan pernyataan kasus penting karena mesin akan menguji setiap kasus dalam urutan kode sumber ECMAScript262: 5 12.11switch-tidak langsung-array
Dalam varian ini rentang disimpan dalam array. Ini lambat di semua lingkungan yang diuji dan sangat lambat di Chrome.
array-linear-search
Ini adalah kombinasi dari pencarian linear nilai-nilai dalam array, dan pernyataan switch dengan nilai-nilai tetap. Alasan seseorang mungkin ingin menggunakan ini adalah ketika nilai tidak diketahui sampai runtime. Ini lambat di setiap lingkungan yang diuji, dan memakan waktu hampir 10 kali lebih lama dalam MSIE.
array-binary-switch
Ini adalah varian
array-linear-switch
tetapi dengan pencarian biner. Sayangnya ini lebih lambat daripada pencarian linear. Saya tidak tahu apakah ini implementasi saya atau apakah pencarian linier lebih dioptimalkan. Bisa juga bahwa keyspace adalah ke kecil.Kesimpulan
Jika kinerja penting, gunakan
if
pernyataan-atauswitch
dengan nilai langsung.sumber
Sebuah alternatif:
Demo: http://jsfiddle.net/UWYzr/
sumber
if(...) else if(...)
? Ini memang menghindarif
tetapi tidak terdengar seperti pengganti yang bagus untuk saya.if
pernyataan. Lihat jawabanHanya berfungsi jika Anda memiliki langkah reguler ...
EDIT: karena solusi ini terus bertambah, saya harus memberi saran bahwa solusi mofolo adalah cara yang lebih baik
sumber
Math.round(scrollLeft/1000)
omong-omong.Anda dapat membuat objek khusus dengan kriteria dan fungsi yang sesuai dengan kriteria
Tetapkan fungsi untuk apa yang ingin Anda lakukan dalam kasus ini (define function1, function2 dll)
Dan "mengevaluasi" aturan
Catatan
Sering kali jika pernyataan lebih mudah dibaca dan dikelola. Saya akan merekomendasikan di atas hanya ketika Anda memiliki banyak kondisi dan kemungkinan banyak pertumbuhan di masa depan.
Perbarui
Seperti @Brad tunjukkan dalam komentar, jika kondisinya saling eksklusif (hanya satu yang benar pada satu waktu), memeriksa batas atas harus memadai:
dengan ketentuan bahwa kondisi didefinisikan dalam urutan menaik (pertama yang terendah
0 to 1000
,, dan kemudian1000 to 2000
misalnya)sumber
action=function1
- bukankah seharusnya ini titik dua? ;-) - Anda juga dapat menolak ini hanya memiliki batas atas karena, karena proses eliminasi, Anda tidak dapat jatuh ke dalam dua kelompok - kecuali jika itu niat Anda (untuk memungkinkan beberapa tindakan).Apa yang sebenarnya kamu lakukan
//do stuff
?Anda mungkin dapat melakukan sesuatu seperti:
sumber
Belum diuji dan tidak yakin apakah ini akan berhasil, tetapi mengapa tidak melakukan beberapa
if statements
sebelumnya, untuk mengatur variabel untukswitch statement
.sumber
Ini adalah pilihan lain:
sumber
Memperbarui jawaban yang diterima (belum dapat berkomentar). Pada 1/12/16 menggunakan demo jsfiddle di chrome, switch-direct adalah solusi tercepat.
Hasil: Resolusi waktu: 1.33
Jadi
sumber
Dalam kasus saya (kode warna persentase, tidak ada kinerja kritis), saya segera menulis ini:
sumber
Saya memiliki situasi yang sama belakangan ini, itulah cara saya menyelesaikannya:
sebelum:
setelah:
Dan jika Anda menetapkan "1, 2, 3, 4, 5" maka itu bisa menjadi lebih sederhana:
sumber