Sampai titik ini kita memegang empat penampung data: array untuk deretan bernomor, object untuk struktur properti, Map untuk pasangan kunci-nilai yang fleksibel, dan Set untuk nilai unik. Keempatnya bisa saling menggantikan dalam banyak kasus — rekap frekuensi bisa ditulis dengan object maupun Map, daftar peserta bisa array maupun Set — dan justru kemampuan itu yang menimbulkan pertanyaan baru: kapan sebaiknya memakai yang mana?

Jawabannya bukan soal selera, melainkan pola akses: bagaimana data dibaca, ditambah, diperiksa, dan dihapus selama program berjalan. Chapter ini merangkum keempat koleksi menjadi pertanyaan penentu dan tabel keputusan, lalu membuktikannya dengan satu berkas yang menyelesaikan empat pola akses berbeda untuk toko Budi.

Empat Pertanyaan Penentu #

Sebelum menyentuh kode, jawab empat pertanyaan ini tentang data yang akan ditampung:

  • Apakah posisi dan urutan adalah identitas datanya? Antrean cetak, riwayat langkah, daftar peringkat — urutan dan duplikat keduanya bermakna. Pilih array.
  • Apakah kuncinya sudah dikenal sejak awal dan tidak bertambah saat program berjalan? Profil toko, konfigurasi tampilan — bentuknya tetap dan propertinya bernama. Pilih object.
  • Apakah kunci bertumbuh saat program berjalan, atau bertipe selain string? Hitungan per item transaksi, peta object ke data, entri yang ditambah-hapus terus. Pilih Map.
  • Apakah yang penting keanggotaan dan keunikan, bukan pasangan kunci-nilai? Daftar email peserta, nomor pesanan yang sudah diproses. Pilih Set.

Ketika dua jawaban terasa benar sekaligus, keduanya memang bisa bekerja bersama — misalnya Map untuk menyimpan data dan Set untuk melacak anggotanya. Kebingungan biasanya muncul justru ketika dua pola akses dipaksakan pada satu penampung, misalnya object yang kuncinya dibangun dari input pengguna dan sekaligus dihitung isinya setiap kali diperbarui.

Tabel Keputusan #

SituasiPilihanAlasan utama
Daftar terurut, posisi index bermakna, duplikat wajararrayakses index, length, dan seluruh method transformasi (map, filter, reduce)
Struktur tetap dengan properti bernamaobjectbentuk terbaca langsung dari kode; cocok untuk profil dan konfigurasi
Kunci dinamis, ditambah-hapus terus, atau bertipe apa punMapset/get/has/delete seragam, size langsung, urutan penyisipan terjaga
Nilai unik, pemeriksaan ada/tidak seringSetadd/has tanpa menyapu isi, plus method perbandingan ES2025
Butuh metadata sementara pada object pihak lainWeakMap/WeakSetreferensi lemah tidak menahan garbage collection

Baris terakhir mengingatkan bahwa pilihan juga menyentuh memori, bukan hanya kenyamanan penulisan.

Koleksi juga boleh bekerja berdampingan dalam satu program. Toko Budi dapat memakai Map dengan kunci nomor pesanan dan nilai object detail pesanan, sementara Set menyimpan nomor pesanan yang belum diproses — dua struktur, dua pola akses, tanpa saling menggantikan. Kombinasi semacam ini lazim di aplikasi nyata: Map untuk data utama, Set untuk penanda status, array untuk urutan tampilan.

Empat Pola dalam Satu Berkas #

Berkas berikut menyelesaikan empat pola akses untuk toko Budi dengan koleksi yang paling sesuai masing-masing, lalu menutup dengan jembatan konversi antar koleksi:

// memilih-koleksi.js
// Satu kebutuhan data, empat koleksi: pilihan mengikuti pola aksesnya.

// Pola 1: urutan penting, duplikat sah -> array
const antreanCetak = ["P-301", "P-302", "P-301"];
console.log(antreanCetak.length);

// Pola 2: keunikan dan pemeriksaan keanggotaan -> Set
const nomorUnik = new Set(antreanCetak);
console.log(nomorUnik.has("P-302"));
console.log(nomorUnik.size);

// Pola 3: struktur tetap dengan kunci yang sudah dikenal -> object
const profilToko = { nama: "Toko Budi", kota: "Bandung" };
console.log(profilToko.nama);
console.log(Object.keys(profilToko).length);

// Pola 4: kunci bertumbuh saat program berjalan -> Map
const transaksi = ["kopi", "teh", "kopi", "gula", "kopi"];
const frekuensi = new Map();
for (const item of transaksi) {
  frekuensi.set(item, (frekuensi.get(item) || 0) + 1);
}
console.log(frekuensi);

// Rekap serupa dengan object: kunci tetap disimpan sebagai string
const rekap = {};
for (const item of transaksi) {
  rekap[item] = (rekap[item] || 0) + 1;
}
console.log(rekap);

// Jembatan antar koleksi: object -> Map
const profil = { nama: "Toko Budi", kota: "Bandung" };
const jadiMap = new Map(Object.entries(profil));
console.log(jadiMap);

Output yang Dihasilkan:

text
3
true
2
Toko Budi
2
Map(3) { 'kopi' => 3, 'teh' => 1, 'gula' => 1 }
{ kopi: 3, teh: 1, gula: 1 }
Map(2) { 'nama' => 'Toko Budi', 'kota' => 'Bandung' }

Mari kita telaah baris-baris pentingnya:

  1. Baris 5–6 (antreanCetak.length): array mempertahankan duplikat P-301 dan urutannya — panjang 3 adalah informasi yang benar untuk antrean cetak.
  2. Baris 9–11 (new Set(antreanCetak)): kebutuhan bergeser ke “nomor mana yang sudah masuk” — has menjawab true dan size memberi 2 karena duplikat menyatu.
  3. Baris 14–16 (profilToko): dua properti dengan nama tetap dibaca langsung; Object.keys().length memberi jumlah properti untuk struktur yang bentuknya tidak berubah.
  4. Baris 20–23 (frekuensi.set(item, ...)): kunci Map bertumbuh mengikuti isi transaksi; (frekuensi.get(item) || 0) + 1 membaca hitungan lama — 0 bila kunci baru — lalu menyimpan hitungan baru. Kombinasi get-set inilah pola hitung frekuensi yang paling lazim di Map.
  5. Baris 24 (console.log(frekuensi)): Node menampilkan ringkasan Map(3) beserta pasangan kunci-nilainya — tiga item dengan hitungan masing-masing.
  6. Baris 27–30 (rekap versi object): hasil akhirnya sama untuk kunci string sederhana. Perbedaannya baru terasa ketika kunci bukan string (chapter Map), ketika size dibaca terus-menerus, atau ketika entri ditambah-hapus dalam jumlah besar.
  7. Baris 34–36 (new Map(Object.entries(profil))): Object.entries memecah object menjadi array pasangan [kunci, nilai], dan constructor Map menerimanya apa adanya — jembatan konversi dua arah, karena Object.fromEntries atau spread entries() mengembalikan jalannya.

Sinyal Saatnya Pindah Koleksi #

Kode yang hidup berubah, dan begitu juga pola aksesnya. Beberapa sinyal yang menunjukkan koleksi saat ini sudah tidak pas:

  • Object → Map: kunci mulai dibangun dari input atau id, entri ditambah-hapus terus-menerus, atau Object.keys(obj).length dipanggil di banyak tempat untuk sekadar menghitung isi.
  • Array → Set: pemeriksaan includes() terjadi berulang-ulang pada data besar, atau duplikat yang selalu harus disaring manual.
  • Array → object atau Map: find() dipanggil berulang-ulang hanya untuk mencari satu id — data lebih baik disusun sebagai indeks yang kuncinya sudah siap, bukan deret yang harus disapu setiap kali dicari.
  • Map/Set → object atau array: data akan dikirim sebagai JSON atau disimpan dalam format teks sederhana — bentuk object dan array lebih langsung dipetakan (pembahasan JSON menunggu di section Data dan Serialization).
  • Map → WeakMap: metadata ternyata hanya hidup selama object pemiliknya hidup, dan pemiliknya dikelola bagian lain program.

Dengan tabel keputusan ini, section Collections tuntas: Map dan Set menyediakan struktur modern, protokol iterasi menyeragamkan penelusurannya, dan pilihan koleksi kini punya dasar yang jelas. Materi berikutnya, section Error Handling, membahas apa yang harus dilakukan ketika program justru berjalan tidak sesuai rencana — termasuk error yang sudah beberapa kali kita tangkap dengan try-catch.

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

memilih-koleksi.js

Unduh berkas
javascript
// memilih-koleksi.js
// Satu kebutuhan data, empat koleksi: pilihan mengikuti pola aksesnya.

// Pola 1: urutan penting, duplikat sah -> array
const antreanCetak = ["P-301", "P-302", "P-301"];
console.log(antreanCetak.length);

// Pola 2: keunikan dan pemeriksaan keanggotaan -> Set
const nomorUnik = new Set(antreanCetak);
console.log(nomorUnik.has("P-302"));
console.log(nomorUnik.size);

// Pola 3: struktur tetap dengan kunci yang sudah dikenal -> object
const profilToko = { nama: "Toko Budi", kota: "Bandung" };
console.log(profilToko.nama);
console.log(Object.keys(profilToko).length);

// Pola 4: kunci bertumbuh saat program berjalan -> Map
const transaksi = ["kopi", "teh", "kopi", "gula", "kopi"];
const frekuensi = new Map();
for (const item of transaksi) {
  frekuensi.set(item, (frekuensi.get(item) || 0) + 1);
}
console.log(frekuensi);

// Rekap serupa dengan object: kunci tetap disimpan sebagai string
const rekap = {};
for (const item of transaksi) {
  rekap[item] = (rekap[item] || 0) + 1;
}
console.log(rekap);

// Jembatan antar koleksi: object -> Map
const profil = { nama: "Toko Budi", kota: "Bandung" };
const jadiMap = new Map(Object.entries(profil));
console.log(jadiMap);