Map va Set — Object va Array dan farqi, qachon ishlatiladi
Muammodan boshlaylik
Siz foydalanuvchilar ro'yxatida takrorlanmaydigan emaillarni yig'moqchisiz. Massiv bilan:
const emaillar = [];
function emailQosh(email) {
if (!emaillar.includes(email)) { // ← tekshirish: O(n)
emaillar.push(email);
}
}
Har qo'shishda butun massivni ko'rib chiqish kerak. 10,000 ta email bo'lsa — har yangi qo'shishda 10,000 ta taqqoslash.
Yoki kalit-qiymat jiftlar uchun ob'ekt ishlatishni ko'rasiz — lekin kalitlar faqat matn bo'lishi mumkin, tartib kafolatlanmaydi.
Map va Set — bu hollar uchun yaratilgan maxsus tuzilmalar.
Set — takrorlanmaydigan qiymatlar to'plami
Set — massiv kabi, lekin takror qiymat qabul qilmaydi. Bir xil qiymat ikki marta qo'shilsa — ikkinchisi e'tiborsiz qoladi.
Hayotiy o'xshatma
Mehmon ro'yxati. Zal eshigida ro'yxat bor — kim kirdi. Bir odam ikki marta kirishga urindi — lekin ro'yxatda faqat bir marta ko'rsatiladi. Set — o'sha ro'yxat: har ism faqat bir marta.
const emaillar = new Set();
emaillar.add("jasur@mail.com");
emaillar.add("malika@mail.com");
emaillar.add("jasur@mail.com"); // ← takror — e'tiborsiz
emaillar.add("sardor@mail.com");
console.log(emaillar.size); // 3 — ikki emas, uch
console.log(emaillar.has("malika@mail.com")); // true — O(1), massivdan tez
Set metodlari
const to_plam = new Set([1, 2, 3, 2, 1]); // ← yaratishda takrorlar ketadi
to'plam.add(4); // qo'shish
to'plam.delete(2); // o'chirish
to'plam.has(3); // true — bormi tekshirish O(1)
to'plam.size; // 3 — uzunlik
to'plam.clear(); // hammani tozalash
// Iterate:
for (const qiymat of to'plam) { console.log(qiymat); }
[...to'plam]; // massivga aylantirish
Massivdan takrorlarni olib tashlash
Set ning eng ko'p ishlatiladigan amaliy qo'llanishi:
const takrorli = [1, 2, 3, 2, 1, 4, 3, 5];
const yagona = [...new Set(takrorli)];
console.log(yagona); // [1, 2, 3, 4, 5]
new Set(massiv) — massivdan Set yaratdi, takrorlar ketdi. [...] — Set ni massivga qaytardi. Ikki qadam, bir qator.
Nima uchun Set, Array emas?
Array.includes — O(n): massiv boshidan oxiriga ko'rib chiqadi. 10,000 elementda — 10,000 taqqoslash.
Set.has — O(1): darhol javob. 10,000 elementda ham — bir taqqoslash. Katta to'plamlarda farq katta.
Map — istalgan kalit bilan kalit-qiymat juftlari
Oddiy ob'ektda kalitlar — faqat matn (yoki Symbol). Map da — istalgan tur kalit bo'lishi mumkin: ob'ekt, funksiya, son, hatto boshqa Map.
Hayotiy o'xshatma
Xaritalash tizimi (kartografiya). Xaritada har nuqtaga (koordinata — ob'ekt) ma'lumot bog'lash kerak. Koordinatani matn sifatida saqlab bo'lmaydi — bu ob'ekt. Map — o'sha tizim: har qanday narsani kalit qilib ishlatish mumkin.
const ma_lumot = new Map();
// Ob'ekt kalit
const foydalanuvchi = { id: 1, ism: "Jasur" };
ma_lumot.set(foydalanuvchi, { sessiya: "abc123", kirdi: new Date() });
// Funksiya kalit
function hisoblash() {}
ma_lumot.set(hisoblash, "ushbu funksiya haqida ma'lumot");
// Son kalit
ma_lumot.set(42, "qirq ikki raqami");
console.log(ma_lumot.get(foydalanuvchi)); // { sessiya: "abc123", ... }
console.log(ma_lumot.size); // 3
Map metodlari
const narxlar = new Map();
narxlar.set("noutbuk", 8_000_000);
narxlar.set("telefon", 3_500_000);
narxlar.set("quloqlik", 450_000);
narxlar.get("noutbuk"); // 8_000_000
narxlar.has("telefon"); // true
narxlar.delete("quloqlik"); // o'chirish
narxlar.size; // 2
// Iterate — kiritilgan tartibda
for (const [kalit, qiymat] of narxlar) {
console.log(`${kalit}: ${qiymat}`);
}
// Kalit yoki qiymatlar alohida
[...narxlar.keys()]; // ["noutbuk", "telefon"]
[...narxlar.values()]; // [8_000_000, 3_500_000]
[...narxlar.entries()]; // [["noutbuk", 8_000_000], ["telefon", 3_500_000]]
Ob'ektdan Map ga va aksincha
// Ob'ektdan Map
const ob = { a: 1, b: 2, c: 3 };
const map = new Map(Object.entries(ob));
// Map(3) { "a" => 1, "b" => 2, "c" => 3 }
// Map dan ob'ekt
const yangiOb = Object.fromEntries(map);
// { a: 1, b: 2, c: 3 }
Map va Object — qachon qaysi?
| Object | Map | |
|---|---|---|
| Kalit turi | faqat string, Symbol | istalgan tur |
| Tartib | ES2015 dan saqlaydi | kiritilgan tartibda — kafolat |
| Iterate | for...in (prototip ham), Object.keys |
for...of — faqat o'z kalitlari |
| Hajm | Object.keys().length — har safar hisob |
.size — darhol |
| Default kalitlar | toString, constructor — prototip |
yo'q |
| JSON | JSON.stringify — to'g'ridan |
Object.fromEntries kerak |
Object ishlatish: JSON bilan ishlash, konfiguratsiya, ma'lumot modeli (statik tuzilma).
Map ishlatish: Kalitlar ob'ekt yoki boshqa tur bo'lganda; ko'p qo'shish/o'chirish; uzunlik tez kerak; iterate tartib muhim.
Set matematik amallar — kesishuv, birlashtirish, farq
Set bilan to'plamlar ustida matematik amallar:
const A = new Set([1, 2, 3, 4]);
const B = new Set([3, 4, 5, 6]);
// Birlashtirish (union): A ∪ B
const birlashtirish = new Set([...A, ...B]);
// Set {1, 2, 3, 4, 5, 6}
// Kesishuv (intersection): A ∩ B
const kesishuv = new Set([...A].filter(x => B.has(x)));
// Set {3, 4}
// Farq (difference): A \ B — A da bor, B da yo'q
const farq = new Set([...A].filter(x => !B.has(x)));
// Set {1, 2}
Tez-tez uchraydigan xatolar
Set da ob'ektlar takrorlanadi:
Set qiymatni === bilan solishtiradi. Ikki ob'ekt tarkibi bir xil bo'lsa ham — ular turli reference, Set ikkisini ham saqlaydi:
const s = new Set();
s.add({ id: 1 });
s.add({ id: 1 }); // ← yangi ob'ekt — boshqa reference
console.log(s.size); // 2 ← takrorlangan emas deb hisoblamadi!
Ob'ektlar uchun takrorni oldini olish — Map + JSON.stringify kaliti yoki boshqa usul kerak.
Map dan JSON.stringify:
const map = new Map([["a", 1], ["b", 2]]);
JSON.stringify(map); // "{}" ← bo'sh! Map to'g'ridan JSON ga o'gilmaydi
// ✅ — oldin ob'ektga aylantirish
JSON.stringify(Object.fromEntries(map)); // '{"a":1,"b":2}'
Xulosa
Set — takrorlanmaydigan qiymatlar to'plami. has — O(1). Massivdan takror olib tashlash uchun: [...new Set(massiv)].
Map — istalgan kalit bilan kalit-qiymat juftlari. Ob'ektdan farqi: ob'ekt kalit, tartib kafolati, size xususiyati.
Qachon ishlatiladi:
Set→ takrorlanmas qiymatlar, tezhastekshiruvi kerakMap→ ob'ekt yoki boshqa tur kalit kerak, ko'p qo'shish/o'chirish, iterate tartib muhim
Keyingi dars
63-dars: Error turlari va xatolarni boshqarish — try, catch, finally, custom error