Rumah > Artikel > hujung hadapan web > Mengapa Set.has() Lebih Cepat Daripada Array.includes() untuk Mencari Item
Kadangkala, apabila membina aplikasi, prestasi akhirnya menjadi kunci atau sekurang-kurangnya pemacu penting, terutamanya apabila berurusan dengan set data yang besar atau keperluan masa nyata. Salah satu tugas yang paling biasa dalam JavaScript adalah untuk menyemak sama ada beberapa nilai wujud dalam koleksi. Dua alternatif yang paling kerap digunakan ialah Array.includes() dan Set.has(). Kedua-duanya berfungsi, tetapi sebenarnya, Set.has() berfungsi lebih baik daripada Array.includes. Mari kita selidiki sebab-sebabnya dan tentukan bila anda harus menggunakan salah satu alternatif.
Terdapat dua kaedah yang kelihatan agak mudah dalam penggunaannya, tetapi mempunyai pelaksanaan yang berbeza, iaitu, Array.includes() dan Set.has().
Array.includes()
Kaedah termasuk() menyemak sama ada nilai yang diberikan hadir dalam tatasusunan.
Ia menggunakan kerumitan masa O(n), supaya semakin besar panjang tatasusunan, semakin lama masa yang diperlukan untuk semakan nilai.
Ini kerana Array.includes() mencari tatasusunan dari mula hingga akhir (atau sehingga ia menjumpai nilai), dan lebih besar tatasusunan, lebih lama masa yang diperlukan.
Set.has()
Kaedah has() bagi Set menyemak sama ada nilai yang diberikan juga wujud tetapi melakukannya dengan lebih pantas.
Set.has() bergantung pada struktur berasaskan jadual cincang yang membenarkan carian masa tetap atau kerumitan masa O(1).
Tidak seperti tatasusunan, set dibina untuk mengendalikan nilai unik, jadi ia tidak akan mempunyai nilai pendua di dalamnya dan mempunyai lebih banyak masa carian.
Apabila anda menggunakan Set.has(), JavaScript boleh mencari item dalam satu operasi langsung, tidak kira berapa banyak item dalam set. Sebagai contoh, semasa menyemak sama ada nilai berada dalam set yang mengandungi sejuta, masa yang digunakan oleh Set.has() akan sama dengan menyemak sepuluh.
Sebaliknya, Array.includes() meneliti setiap elemen dari kiri ke kanan secara berurutan sehingga ia mungkin sama ada mencari item yang diminati atau mencapai penghujungnya. Ini bermakna semakin lama saiznya, masa semak mengambil masa, terutamanya dalam kes item yang hampir dengan penghujung-dan pasti apabila item yang dimaksudkan tidak ada.
Berikut adalah contoh yang dekat:
const bigArray = Array.from({ length: 1000000 }, (_, i) => i); const bigSet = new Set(bigArray); const valueToFind = 999999; // Array.includes (O(n)) - Slower for large arrays console.time("Array.includes"); bigArray.includes(valueToFind); console.timeEnd("Array.includes"); // Set.has (O(1)) - Faster for large sets console.time("Set.has"); bigSet.has(valueToFind); console.timeEnd("Set.has");
Apabila anda menjalankan ini, anda melihat Set.has() jauh mengatasi Array.includes() pada tatasusunan besar. Dalam praktiknya, perbezaan itu mungkin diterjemahkan kepada animasi yang lebih lancar, masa pemuatan yang lebih pantas atau lebih sedikit penggunaan sumber pada pelayan anda.
Ini semua bergantung pada apa yang anda cuba capai. Berikut ialah ringkasan ringkas:
Gunakan Set.has() jika:
Gunakan Array.includes() jika:
Bayangkan anda sedang melaksanakan ciri carian pengguna yang menapis nama terhadap senarai perkataan yang disekat. Jika anda mempunyai ratusan perkataan yang disekat dan sedang mencari dengan kerap, menggunakan Set untuk perkataan yang disekat boleh menjadikan setiap pemeriksaan carian lebih pantas:
const bigArray = Array.from({ length: 1000000 }, (_, i) => i); const bigSet = new Set(bigArray); const valueToFind = 999999; // Array.includes (O(n)) - Slower for large arrays console.time("Array.includes"); bigArray.includes(valueToFind); console.timeEnd("Array.includes"); // Set.has (O(1)) - Faster for large sets console.time("Set.has"); bigSet.has(valueToFind); console.timeEnd("Set.has");
Walaupun dalam kes yang lebih kecil, Set akan membantu memastikan perkara itu cekap dan boleh diramal. Selain itu, jika senarai perkataan yang disekat bertambah, anda sudah pun mempunyai penyelesaian berskala.
Prestasi: Set.has() menawarkan kerumitan masa O(1), menjadikannya lebih pantas daripada Array.includes() dengan O(n) untuk koleksi yang lebih besar
Kesesuaian: Set direka bentuk untuk nilai unik, jadi ia dioptimumkan secara semula jadi untuk carian. Tatasusunan lebih fleksibel dengan nilai pendua tetapi lebih perlahan dalam menyemak kewujudan.
Skalabiliti: Apabila data anda berkembang, Set.has() terus menunjukkan prestasi yang baik, manakala Array.includes() akan menjadi perlahan.
Adalah penting untuk mengetahui saiz dan sifat set data anda apabila memilih antara Set.has() dan Array.includes(). Array.includes() adalah baik untuk set data kecil, tetapi Set.has() ialah alat yang berharga dalam situasi di mana kelajuan adalah kritikal. Struktur data yang betul boleh membantu mengoptimumkan aplikasi JavaScript anda untuk menjadi lebih pantas dan cekap tanpa membuat perubahan besar pada kod anda.
Oleh itu, apabila anda mendapati diri anda menyemak sama ada ada sesuatu, maka anda harus bertanya kepada diri sendiri: Adakah itu kerja untuk tatasusunan, atau adakah saya boleh menggunakan kuasa set? Memperbetulkannya mungkin perbezaan yang diperlukan oleh aplikasi anda.
Atas ialah kandungan terperinci Mengapa Set.has() Lebih Cepat Daripada Array.includes() untuk Mencari Item. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!