Map va Set — Object va Array dan farqi, qachon ishlatiladi

~20 daq · JavaScript · Ilg'or mavzular

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, tez has tekshiruvi kerak
  • Map → 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