Soal 1Dengan const ids = new Set(["u-1", "u-2"]);, jalankan ids.add("u-1");. Berapa ids.size?
Map dan Set — Menghapus Duplikat dan Tally Berkunci
Pelajari Set, yang menyimpan tiap value sekali, dan Map, yang menyimpan key-value sesuai urutan.
Kumpulkan tag yang menempel di sebuah produk ke dalam array, dan tag yang sama terus muncul berulang — buat tahu sebenarnya ada berapa jenis yang berbeda, kamu harus mengecek pakai includes tiap kali. Mau menyimpan pasangan key-value, seperti jumlah stok berdasarkan product ID, juga kena masalah yang sama kalau cuma pakai array: kamu butuh dua array terpisah untuk ID dan jumlah yang selaras berdasarkan posisi, dan key sebuah object cuma bisa berupa string dan symbol, jadi angka nggak bisa langsung dipakai sebagai key.
Artikel ini membahas Set, yang nggak pernah menyimpan duplikat, dan Map, yang bisa pakai lebih dari sekadar string sebagai key.
Menghapus Duplikat — Membangun Set
Misalnya kamu mau tahu berapa banyak tag berbeda yang sebenarnya dipakai di daftar produk yang ditandai tag. Dalam array biasa, tag yang sama muncul lebih dari sekali, jadi menghitungnya apa adanya bikin jumlahnya menggelembung. Kamu perlu struktur data yang sejak awal menyimpan value tanpa duplikat.
Set (struktur data yang menyimpan tiap value cuma sekali) dibangun dengan memberikan sebuah array, seperti new Set(tags). new di depan adalah syntax yang kamu taruh sebelum membuat instance baru dari jenis struktur data tetap, seperti Set atau Map.
Karena value yang sama tidak pernah menambah duplikat, membaca size saja memberitahumu jumlah value yang berbeda. Apakah dua value dianggap sama mengikuti aturan yang sama seperti ===.
Set bukan array, jadi index seperti uniqueTags[0] nggak akan mengembalikan apa-apa. Kalau butuh dalam bentuk array, konversikan pakai spread syntax, seperti [...uniqueTags].
Urutannya tetap persis seperti saat item pertama kali ditambahkan, jadi urutan kemunculan pertama di array aslinya terbawa tanpa berubah.
const tags = ["Sale", "New", "Sale", "Free Shipping"];
// Berikan sebuah array, dan kamu dapat Set dengan duplikat terhapus
const uniqueTags = new Set(tags);
console.log(uniqueTags.size); // 3
// Konversi balik ke array dengan spread syntax (urutan penambahan terjaga)
console.log([...uniqueTags].join(", ")); // Sale, New, Free Shipping
// Array aslinya tidak tersentuh
console.log(tags.length); // 4
// Kamu juga bisa mulai dari Set kosong
const empty = new Set();
console.log(empty.size); // 0
Menambah dan Menghapus Value — add, has, dan delete
Kadang kamu mau mencatat ID pengunjung dan menghitung orang yang sama sebagai 1 tidak peduli berapa kali dia balik lagi. Simpan ini di array, dan tiap penambahan berarti mengecek dengan includes sebelum push — makin banyak catatannya menumpuk, makin lama pengecekan itu makan waktu.
Set punya add untuk menambah value, has untuk mengecek apakah dia punya, delete untuk menghapus, dan size untuk jumlahnya. add tidak melakukan apa-apa saat value yang sama masuk, jadi kamu tidak pernah perlu mengecek sebelum menambah.
has mengembalikan true atau false, dan delete mengembalikan apakah dia benar-benar menghapus sesuatu.
add value yang sama berapa kali pun tidak pernah menambah jumlahnya. Cuma menghapus yang mengurangi.const visitors = new Set(["u-102", "u-337"]);
// Cek apakah dia punya
console.log(visitors.has("u-102")); // true
console.log(visitors.has("u-999")); // false
// Tambah satu. Value yang sama tidak mengubah jumlahnya
visitors.add("u-541");
console.log(visitors.size); // 3
visitors.add("u-541");
console.log(visitors.size); // 3
// Hapus satu. Apakah dia benar-benar menghapus sesuatu, kembali sebagai hasil
console.log(visitors.delete("u-102")); // true
console.log(visitors.delete("u-102")); // false (sudah hilang)
console.log(visitors.size); // 2
Menyimpan Key-Value Pair — Map
Kadang kamu mau menyimpan key dan value sebagai pasangan, seperti jumlah stok berdasarkan product ID. Object juga bisa melakukan ini, tapi untuk menghitung key yang diputuskan saat runtime — seperti ID — dan menyesuaikannya seiring waktu, struktur data dengan method khusus lebih cocok dipakai.
Map (struktur data yang menyimpan key-value pair sesuai urutan pendaftarannya) dibangun dengan new Map(), dan kamu mendaftarkan entri dengan set(key, value). Untuk membaca satu, pakai get(key); untuk mengecek apakah satu ada, has(key); untuk jumlahnya, size.
set key yang sama lagi, dan value-nya ditimpa. Untuk mulai dengan entri yang sudah terisi, berikan array pasangan, seperti new Map([["P-001", 12], ["P-002", 5]]).
set mendaftarkan sebuah pasangan, dan get mencari value berdasarkan key. Key tanpa entri mengembalikan undefined.const stock = new Map();
// Daftarkan pasangan dengan set
stock.set("P-001", 12);
stock.set("P-002", 5);
console.log(stock.size); // 2
// Cari value dari key dengan get
console.log(stock.get("P-002")); // 5
console.log(stock.get("P-999")); // undefined
console.log(stock.has("P-999")); // false
// set key yang sama lagi, dan itu menimpa
stock.set("P-001", 8);
console.log(stock.get("P-001")); // 8
console.log(stock.size); // 2 (jumlahnya tidak bertambah)
// Kamu juga bisa membangunnya dengan pasangan sudah terisi
const prices = new Map([["P-001", 3980], ["P-002", 2480]]);
console.log(prices.get("P-001")); // 3980
Value Sebuah Map Tidak Bisa Dibaca dengan Dot Notation
Tulis stock["P-001"] alih-alih stock.get("P-001"), dan kamu tidak akan dapat value-nya kembali. Syntax itu mencari property di object Map itu sendiri, yang tidak ada hubungannya dengan pasangan yang kamu daftarkan, jadi dia mengembalikan undefined. Rutekan pembacaan dan penulisan lewat get dan set.
Memilih Antara Map dan Object — Type Key dan Urutan
Karena dia menyimpan key dan value sama seperti object, kamu memilih di antara keduanya. Saat key-nya tetap di waktu kamu menulis kodenya, seperti field settings, object cocok; saat kamu menghitung key yang bertambah saat runtime, seperti ID atau tanggal, Map lebih mudah dikerjakan.
Type key dan urutan itulah yang jadi dasar keputusanmu.
Key sebuah object dikonversi jadi string, jadi bahkan menulis record[2026], key sebenarnya adalah "2026". Map memakai apa pun value yang kamu berikan sebagai key persis apa adanya, jadi number 2026 dan string "2026" diperlakukan sebagai key berbeda.
Urutannya juga bekerja berbeda — Map selalu menjaga urutan pendaftarannya.
| Aspek | Object | Map |
|---|---|---|
| Type yang diizinkan sebagai key | Dikonversi jadi string | Type apa pun, dipertahankan apa adanya |
| Urutan | Key mirip integer diurutkan duluan | Tetap sesuai urutan pendaftaran |
| Menghitung entri | length milik Object.keys | size |
| Membaca & menulis | obj.key / obj[key] | get dan set |
| Paling cocok untuk | Koleksi field yang tetap | Menghitung key yang bertambah saat runtime |
Untuk mendaftar isi sebuah Map, tulis [...stock.entries()] untuk mengonversinya jadi array pasangan [key, value], masing-masing array 2 element. Itu membiarkanmu mengambil 1 pasangan satu per satu, seperti entries[0]. Mengulangi langkah yang sama untuk tiap pasangan, berapa pun jumlahnya, dibahas lagi di artikel tentang loop.
Saat kamu cuma perlu key-nya, pakai stock.keys() — tapi karena yang dikembalikan bukan array, kamu tidak bisa langsung merangkai join padanya. Tulis [...stock.keys()] untuk mengonversinya jadi array dulu.
const scores = new Map([["math", 80]]);
// Map menjaga key number sebagai number
scores.set(2026, "this year's tally");
console.log(scores.get(2026)); // this year's tally
console.log(scores.get("2026")); // undefined (key yang berbeda)
// Key sebuah object dikonversi jadi string
const record = {};
record[2026] = "this year's tally";
console.log(Object.keys(record)[0]); // 2026
console.log(typeof Object.keys(record)[0]); // string
console.log(record["2026"]); // this year's tally (diperlakukan sebagai key sama)
// Konversi keys() / entries() jadi array dengan spread syntax sebelum dipakai
console.log([...scores.keys()].join(", ")); // math, 2026
const pairs = [...scores.entries()];
console.log(pairs[0].join(": ")); // math: 80
// Object mengurutkan key mirip integer duluan
const ranking = {};
ranking[3] = "c";
ranking[1] = "a";
console.log(Object.keys(ranking).join(", ")); // 1, 3
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Dengan stock sebagai Map, apa yang dikembalikan stock.get("P-999") untuk key yang belum terdaftar?
Soal 3Daftarkan number 2026 sebagai key. Apa bedanya antara Map dan object?