Pernah pengen nyimpen pasangan key-value di JavaScript? Kebanyakan langsung ngira "pakai Object aja kan?" — bener, tapi Object punya batasan: key SELALU di-convert ke string, urutan masuk gak terjamin, ribet di-iterate. Solusinya: Map — struktur data yang dirancang khusus buat key-value pairs. Key bisa apa aja (number, object, function), urutan terjamin sesuai urutan insert, gampang di-iterate. Sodaranya: Set — kumpulan nilai unik (auto-reject duplikat).
🤔 Trick paling populer.
[...new Set(arr)]— gabungin Set (auto-unique) dengan spread operator, dapet array tanpa duplikat dalam satu baris. Resep dedupe yang dipake di production code di mana-mana.
Map — seperti Object, tapi key bisa bertipe apapun:
const peta = new Map();
peta.set("nama", "Budi");
peta.set(1, "satu");
peta.get("nama"); // "Budi"
peta.size; // 2
peta.has("nama"); // true
Set — kumpulan nilai unik (tidak ada duplikat):
const unik = new Set([1, 2, 2, 3, 3]);
console.log(unik.size); // 3 (duplikat dihapus otomatis)
unik.add(4);
unik.has(2); // true
unik.delete(1);
Kapan pakai Map vs Object?
- Gunakan Map jika key bukan string, atau jika urutan penting
- Gunakan Object untuk data dengan struktur tetap
Kapan pakai Set vs Array?
- Gunakan Set jika tidak boleh ada duplikat
- Gunakan Array jika urutan dan duplikat penting
🎭 Analogi sehari-hari
- Map = kamus berhalaman dengan label. Key bisa apapun (angka, object, fungsi), urutan terjamin sesuai urutan masuk. Mau cari = buka label.
- Set = kantong kelereng unik — kalau coba masukin kelereng warna sama, otomatis tidak masuk (sudah ada).
Object juga bisa jadi "kamus" tapi kunci di-convert ke string. Map tidak — 1 (number) dan "1" (string) di Map = key beda.
⚠️ Jebakan yang sering ditemui
- Object key auto convert ke string.
{}[1] = "a"; {}["1"]→ "a" (sama). Map:m.set(1,"a"); m.get("1")→ undefined. - Iterate Map = entries
[key, value].for (const [k, v] of map). Sering lupa destructure. - Cek size pakai
.size, bukan.length.set.length= undefined. - Spread Set = array unik — trick paling populer.
[...new Set(arr)]= dedupe satu baris. - Set comparison pakai
===.new Set([{a:1}, {a:1}])size = 2 (object beda referensi). - Map tidak JSON-serializable langsung.
JSON.stringify(new Map())="{}". PakaiObject.fromEntries(map)dulu. - WeakMap/WeakSet beda — key harus object, tidak iterable, tidak ada size. Untuk asosiasi data + auto-cleanup.
🎯
Mapvs plainObject— pilih yang mana?
- Key non-string (number, object, function) →
Map(Object auto convert ke string)- Sering tambah/hapus entries →
Map(perf lebih bagus untuk frequent mutations)- Butuh urutan masuk yang terjamin →
Map(Object urutan inconsistent untuk numeric keys)- Butuh
.size→Map(Object harusObject.keys(o).length)- Static config/data structure (key string, gak diubah) → plain
Object(sintaks lebih ringkas, JSON-friendly)- Class instance / domain model → plain
Objectatau class (Map untuk data dynamic murni)Aturan praktis: kebanyakan kasus = Object cukup. Pakai Map kalau key non-string, mutation berat, atau butuh ordering. JSON-serializable defaultnya = Object.
TL;DR: Map = key-value, key bisa apa aja (number, object, function), urutan terjamin, mutation perf bagus. Pakai .set()/.get()/.size. Set = kumpulan nilai unik (auto-reject duplikat). Trick dedupe paling populer: [...new Set(arr)]. Object key auto-convert ke string, Map tidak — 1 ≠ "1". Iterate Map = [key, value] entries. Set comparison pakai === (object beda referensi gak dianggap dup). Map gak JSON-serializable langsung.