Set adalah kumpulan nilai yang masing-masing cuma boleh ada satu kali. Nilai yang sudah ada dan dimasukkan lagi diabaikan, jadi isinya selalu unik. Set juga bisa menjawab "nilai ini ada gak?" dengan sangat cepat. Mirip daftar tamu undangan: nama yang tertulis dua kali tetap dihitung satu tamu.
🧪 Tebakan cepat:
new Set([3, 1, 3, 5, 1, 7, 3])isinya berapa nilai, dan urutannya gimana? Tebak dulu, jawabannya ada di bagian "Membuang duplikat dari array".
Set: tiap nilai cuma sekali
const angka = new Set([1, 3, 5, 7]);
angka.add(9);
angka.add(3); // sudah ada, diabaikan
console.log(angka.size); // 5
console.log(angka.has(5)); // true
console.log(angka.has(4)); // false
angka.delete(1);
console.log([...angka]); // [3, 5, 7, 9]
new Set([1, 3, 5, 7])bikin Set dari sebuah array. Isinya ditulis di dalam satu array, bukannew Set(1, 3, 5, 7).add(9)menambah satu nilai.add(3)gak mengubah apa-apa, karena 3 sudah ada.has(5)menjawabtrueataufalse.delete(1)menghapus satu nilai.sizeadalah jumlah nilai. Set gak punyalength.[...angka]mengubah Set jadi array lagi. Titik tiga (spread) membuka isi Set satu per satu ke dalam array baru.
Set menjaga urutan masuk: nilai disimpan sesuai kapan dia pertama kali ditambahkan.
Membuang duplikat dari array
const dobel = [3, 1, 3, 5, 1, 7, 3];
const unik = [...new Set(dobel)];
console.log(unik); // [3, 1, 5, 7]
console.log(dobel); // [3, 1, 3, 5, 1, 7, 3]
Waktu new Set(dobel) dibuat, nilainya dimasukkan satu per satu:
| Langkah | Nilai | Sudah ada? | Isi Set |
|---|---|---|---|
| 1 | 3 | belum, masuk | 3 |
| 2 | 1 | belum, masuk | 3, 1 |
| 3 | 3 | sudah, diabaikan | 3, 1 |
| 4 | 5 | belum, masuk | 3, 1, 5 |
| 5 | 1 | sudah, diabaikan | 3, 1, 5 |
| 6 | 7 lalu 3 | 7 masuk, 3 diabaikan | 3, 1, 5, 7 |
Jawaban tebakan: 4 nilai, dalam urutan pertama kali muncul, 3, 1, 5, 7. Lalu [...] mengubahnya jadi array lagi. Array aslinya gak berubah. Dalam function, cukup return [...new Set(arr)];, atau Array.from(new Set(arr)) yang hasilnya sama.
has lebih cepat dari includes
arr.includes(x) mengecek isi array dari depan satu per satu. Itu O(n): array dua kali lebih panjang, waktunya kira-kira dua kali lebih lama. set.has(x) memakai trik yang sama dengan hash map, jadi rata-rata O(1): satu langkah, sebesar apa pun Set-nya.
| Array | Set | |
|---|---|---|
| Nilai kembar | boleh | otomatis dibuang |
Ambil lewat posisi (arr[0]) |
bisa | gak bisa |
| Cek "ada gak?" | includes, O(n) |
has, rata-rata O(1) |
Jadi pakai Set kalau kamu butuh nilai yang unik dan sering mengecek "sudah ada belum?", misalnya daftar halaman yang sudah dikunjungi. Pakai array kalau urutan posisi penting atau nilai boleh kembar.
⚠️ Jebakan yang sering ketemu
- Mengembalikan Set, padahal diminta array.
return new Set(arr)memberi Set, dan Set gak punyajoinataumap. Ubah dulu jadi array:[...new Set(arr)]. lengthdi Set. Hasilnyaundefined. Jumlah isi Set ada disize.- Isi ditulis tanpa array.
new Set(1, 2, 3)error, karena Set butuh satu array (atau daftar lain) berisi nilainya:new Set([1, 2, 3]).
📌 Gabungan, irisan, dan selisih
const a = new Set([1, 2, 3, 4]);
const b = new Set([3, 4, 5, 6]);
const gabungan = new Set([...a, ...b]);
const irisan = [...a].filter((x) => b.has(x));
const selisih = [...a].filter((x) => !b.has(x));
console.log([...gabungan]); // [1, 2, 3, 4, 5, 6]
console.log(irisan); // [3, 4]
console.log(selisih); // [1, 2]
Gabungan (union) adalah semua nilai dari dua Set. Irisan (intersection) adalah nilai yang ada di keduanya. Selisih (difference) adalah nilai yang ada di a tapi gak ada di b.
TL;DR: Set menyimpan nilai unik: add nilai yang sudah ada diabaikan. new Set([...]) dibuat dari array, size menghitung isinya, has mengecek ada atau gak dengan rata-rata O(1), lebih cepat dari includes yang O(n). Set menjaga urutan pertama kali muncul. Buang duplikat dari array: [...new Set(arr)], yang mengembalikan array baru tanpa mengubah array asli. Pakai Set untuk nilai unik dan cek keberadaan yang cepat, array untuk posisi dan nilai kembar.