Penulis materi, terjemahan yang kami terbitkan hari ini, mengatakan bahwa ia yakin bahwa banyak pengembang JavaScript terutama menggunakan tipe data seperti 
Number , 
String , 
Object , 
Array , dan 
Boolean . Dalam kebanyakan kasus, ini sudah cukup. Tetapi jika Anda perlu membuat kode secepat dan scalable mungkin, penggunaan tipe data ini tidak selalu dibenarkan.

Pada artikel ini, kita akan berbicara tentang bagaimana, menggunakan tipe data 
Set , yang menyediakan kemampuan untuk bekerja dengan koleksi nilai unik, membuat kode lebih cepat. Ini terutama berlaku untuk kode proyek skala besar. Tipe 
Array dan 
Set memiliki banyak kesamaan, tetapi menggunakan tipe data 
Set dapat memberikan programmer fitur yang jelas terwujud selama pelaksanaan program yang tidak dimiliki 
Array .
Apa perbedaan antara Array dan Set tipe data?
Fitur utama dari tipe data 
Array (kami akan memanggil objek dari jenis ini "array") adalah bahwa array adalah kumpulan nilai yang diindeks. Ini berarti bahwa data dalam array disimpan menggunakan indeks.
 const arr = [A, B, C, D]; console.log(arr.indexOf(A));  
Tidak seperti array, objek dari tipe 
Set (kami akan menyebutnya "koleksi") adalah koleksi yang berisi data dalam format kunci / nilai. Alih-alih menggunakan indeks, koleksi menyimpan item menggunakan kunci. Elemen yang disimpan dalam koleksi dapat diurutkan sesuai urutannya ditambahkan ke koleksi, sementara koleksi tidak dapat menyimpan elemen yang sama. Dengan kata lain, semua elemen koleksi harus unik.
Apa kekuatan utama dari koleksi ini?
Jika Anda membandingkan koleksi dan array, maka Anda dapat menemukan beberapa keunggulan dibandingkan koleksi di atas array, terutama terlihat dalam situasi di mana kinerja program penting:
- Cari item. Metode array indexOf()danincludes(), digunakan untuk mencari elemen dan memeriksa apakah suatu elemen memiliki elemen, bekerja perlahan.
- Menghapus item. Item dapat dihapus dalam koleksi berdasarkan nilainya. Dalam sebuah array, ekuivalen dari tindakan semacam itu akan menggunakan metode splice(), berdasarkan indeks elemen. Seperti halnya pencarian item, menghapus item menggunakan indeks adalah operasi yang lambat.
- Sisipkan item. Jauh lebih cepat untuk menambahkan elemen ke koleksi daripada menggunakan metode seperti push()danunshift()dalam array.
- Bekerja dengan nilai NaN. MetodeindexOf()tidak dapat digunakan untuk menemukan nilaiNaNdalam array, saat menggunakan metode koleksihas(), Anda dapat menentukan apakah memilikiNaNdi dalamnya.
- Menghapus item duplikat. Setobjek hanya menyimpan nilai unik. Jika Anda perlu menghindari menyimpan elemen duplikat dalam beberapa struktur data, ini adalah keunggulan signifikan mereka daripada array. Ketika bekerja dengan array untuk menghapus elemen duplikat harus menulis kode tambahan.
Daftar lengkap metode objek objek 
Set dapat ditemukan di 
sini .
Pada kompleksitas waktu algoritma
Metode yang digunakan array untuk mencari elemen memiliki kompleksitas waktu linear - O (N). Dengan kata lain, waktu pencarian elemen sebanding dengan ukuran array.
Tidak seperti array, metode yang digunakan oleh koleksi untuk menemukan, menghapus, dan menambahkan elemen memiliki kompleksitas waktu O (1). Ini berarti bahwa ukuran koleksi hampir tidak berpengaruh pada waktu kerja metode tersebut.
Di sini Anda dapat membaca lebih lanjut tentang kompleksitas waktu dari algoritma.
Seberapa cepat koleksi daripada array?
Meskipun indikator kinerja kode JavaScript sangat dipengaruhi oleh berbagai faktor, khususnya, mereka bergantung pada sistem tempat kode dijalankan, pada runtime kode yang digunakan, pada ukuran data yang diproses, saya harap hasil pengujian saya akan memberi Anda kesempatan untuk membandingkan array dan koleksi dari sudut pandang praktis, dan pahami bagaimana koleksi lebih cepat daripada array. Sekarang kita akan mempertimbangkan tiga tes sederhana dan menganalisis hasilnya.
Preparation Persiapan tes
Sebelum melakukan tes apa pun, mari buat array dengan sejuta elemen dan koleksi yang sama. Demi kesederhanaan, kami akan menggunakan siklus, nilai penghitung pertama yang akan 0, dan yang terakhir - 999999:
 let arr = [], set = new Set(), n = 1000000; for (let i = 0; i < n; i++) { arr.push(i); set.add(i); } 
βTest No. 1: memeriksa keberadaan elemen dalam array dan koleksi
Pertama, kami akan memeriksa keberadaan elemen 
123123 dalam array dan koleksi, mengetahui sebelumnya bahwa elemen tersebut ada dalam struktur data ini.
 let result; console.time('Array'); result = arr.indexOf(123123) !== -1; console.timeEnd('Array'); console.time('Set'); result = set.has(123123); console.timeEnd('Set'); 
Berikut adalah hasil dari tes ini:
 Array: 0.173ms Set: 0.023ms 
Koleksi ini 7,54 kali lebih cepat dari array.
βTest No. 2: penyisipan elemen
Sekarang mari kita coba menambahkan elemen ke array dan koleksi.
 console.time('Array'); arr.push(n); console.timeEnd('Array'); console.time('Set'); set.add(n); console.timeEnd('Set'); 
Inilah yang terjadi:
 Array: 0.018ms Set: 0.003ms 
Koleksinya 6,73 kali lebih cepat dari array.
βTest 3: hapus satu item
Sekarang mari kita hapus item dari setiap struktur data (misalnya, yang ditambahkan dalam tes sebelumnya). Array tidak memiliki metode bawaan untuk menghapus elemen, jadi kami akan membuat fungsi pembantu untuk menjaga kode kami dalam kondisi baik:
 const deleteFromArr = (arr, item) => { let index = arr.indexOf(item); return index !== -1 && arr.splice(index, 1); }; 
Dan di sini adalah kode tes:
 console.time('Array'); deleteFromArr(arr, n); console.timeEnd('Array'); console.time('Set'); set.delete(n); console.timeEnd('Set'); 
Hasilnya adalah sebagai berikut:
 Array: 1.122ms Set: 0.015ms 
Dalam hal ini, koleksinya adalah 74,13 kali lebih cepat daripada array!
Secara umum, dapat dicatat bahwa kinerja kode dapat meningkat secara signifikan dengan menggunakan koleksi, bukan array. Perhatikan beberapa contoh praktis.
Contoh # 1: menghapus nilai duplikat dari array
Jika Anda perlu menghapus nilai duplikat dari array dengan cepat, Anda bisa mengubahnya menjadi koleksi. Ini mungkin cara termudah untuk menghilangkan nilai duplikat:
 const duplicateCollection = ['A', 'B', 'B', 'C', 'D', 'B', 'C'];  
Contoh 2: Tugas wawancara di Google
Dalam salah satu 
materi saya 
, saya memeriksa empat opsi untuk menjawab pertanyaan yang diajukan oleh pewawancara dari Google. Wawancara dilakukan dengan menggunakan C ++, tetapi jika JavaScript digunakan sebagai ganti bahasa ini, struktur data 
Set akan digunakan untuk menyelesaikan masalah.
Jika Anda ingin memahami jawaban untuk pertanyaan ini lebih dalam - baca artikel di atas. Di sini saya hanya menunjukkan solusi yang sudah jadi.
β Tugas
Diberikan array bilangan bulat yang tidak disortir dan nilai 
sum . Tulis fungsi yang mengembalikan 
true jika, sebagai hasil menambahkan dua elemen array ini, kita mendapatkan nilai 
sum . Jika tidak ada elemen seperti itu dalam array, fungsi tersebut akan mengembalikan 
false .
Ternyata, misalnya, bahwa jika kita diberi array 
[3, 5, 1, 4] dan nilai 
sum adalah 
9 , maka fungsi tersebut harus mengembalikan 
true , karena 
4+5=9 .
OlSolusi
Anda dapat mendekati masalah ini menggunakan ide berikut: Anda perlu mengulangi lebih dari array, membuat struktur 
Set data saat diurutkan, ke mana nilai akan ditambahkan yang melengkapi nilai yang ditemukan ke nilai 
sum .
Mari kita analisis ide ini menggunakan contoh array di atas. Ketika kita bertemu 
3 , kita dapat menambahkan angka 
6 ke koleksi, karena kita tahu bahwa kita perlu menemukan dua angka yang totalnya 
9 . Lalu, setiap kali kita menemukan nilai baru dari array, kita dapat memeriksa koleksi dan melihat apakah ada. Ketika kami memenuhi angka 
5 , kami akan menambahkan 
4 ke koleksi. Dan ketika, akhirnya, kami sampai ke nomor 
4 , kami menemukannya di koleksi dan dapat mengembalikan 
true .
Berikut ini solusi untuk masalah ini:
 const findSum = (arr, val) => { let searchValues = new Set(); searchValues.add(val - arr[0]); for (let i = 1, length = arr.length; i < length; i++) {   let searchVal = val - arr[i];   if (searchValues.has(arr[i])) {     return true;   } else {     searchValues.add(searchVal);   } }; return false; }; 
Dan inilah solusi yang lebih ringkas:
 const findSum = (arr, sum) => arr.some((set => n => set.has(n) || !set.add(sum - n))(new Set)); 
Karena kompleksitas waktu metode 
Set.prototype.has() adalah O (1), menggunakan struktur data 
Set untuk menyimpan angka yang melengkapi angka-angka yang ditemukan dalam array ke nilai yang diberikan memungkinkan Anda untuk menemukan solusi dalam waktu linier (O (N)).
Jika solusinya bergantung pada metode 
Array.prototype.indexOf() atau pada metode 
Array.prototype.includes() , kompleksitas waktu masing-masing adalah O (N), maka kompleksitas waktu total dari algoritma tersebut adalah O (N 
2 ). Akibatnya, ia akan menjadi jauh lebih lambat.
Ringkasan
Jika Anda belum pernah menemukan tipe data 
Set di JavaScript sebelumnya, maka kami harap sekarang, setelah mengetahuinya, Anda akan dapat menggunakannya dengan manfaat dalam proyek Anda.
Pembaca yang budiman! Bagaimana Anda menerapkan struktur data 
Set di kode Anda?