Гузариш ба мундариҷа
Мавзӯи 14 аз 16
Назария

Map ва Set

Ин барои чӣ лозим аст

Объектҳо ва массивҳо аксари масъалаҳоро ҳал мекунанд, аммо на ҳамаро. Баъзан луғат лозим аст, ки калидҳояш на танҳо сатр бошанд, ё шумориши тез муҳим аст. Баъзан бошад маҷмӯи бе такрор лозим аст: меҳмонони ягона, рӯйхати тегҳо, санҷиши «оё инро пештар дидаем». Барои ин дар JavaScript ду коллексия ҳаст — Map ва Set.

Set — маҷмӯи қиматҳои ягона

const tags = new Set();
tags.add("js");
tags.add("css");
tags.add("js");          // такрор — нодида гирифта мешавад
console.log(tags.size);
console.log(tags.has("css"));
tags.delete("css");
console.log([...tags]);

Натиҷа:

2
true
["js"]

Set-ро бевосита аз массив сохтан мумкин аст — такрорҳо нопадид мешаванд:

const visits = ["Аня", "Тимур", "Аня", "Ира", "Тимур"];
const people = new Set(visits);
console.log(people.size);
console.log([...people]);

Натиҷа:

3
["Аня","Тимур","Ира"]

[...set] маҷмӯаро боз ба массив табдил медиҳад. Тартиб — мисли илова шудани қиматҳо.

Гузаштан аз Set

for (const tag of new Set(["a", "b"])) {
  console.log(tag);
}

Натиҷа:

a
b

Map — луғат

Map ҷуфтҳои «калид → қимат»-ро нигоҳ медорад, мисли объект, аммо:

  • калид метавонад ҳар чиз бошад: адад, объект, ҳатто функсия (калидҳои объект — танҳо сатр);
  • андоза — хосияти size;
  • калидҳои «дарунсохт» мисли constructor, ки дар ҳар объект ҳастанд, нестанд;
  • тартиби калидҳо ҳамеша ба тартиби илова баробар аст.
const stock = new Map();
stock.set("apple", 10);
stock.set("pear", 4);
stock.set("apple", 12);           // аз нав навиштан
console.log(stock.get("apple"));
console.log(stock.get("plum"));   // чунин калид нест
console.log(stock.has("pear"), stock.size);
stock.delete("pear");
console.log([...stock]);

Натиҷа:

12
undefined
true 2
[["apple",12]]

Map-ро бевосита аз массиви ҷуфтҳо сохтан мумкин аст: new Map([["a", 1], ["b", 2]]).

Гузаштан аз Map

const prices = new Map([["tea", 50], ["coffee", 90]]);
for (const [name, price] of prices) {
  console.log(`${name}: ${price}`);
}
console.log([...prices.keys()], [...prices.values()]);

Натиҷа:

tea: 50
coffee: 90
["tea","coffee"] [50,90]

Ҳар унсури Map ҳангоми гузаштан — ҷуфти [калид, қимат] аст, онро бо деструктуризатсия ҷудо кардан қулай аст.

Объект ↔ Map

const obj = { a: 1, b: 2 };
const map = new Map(Object.entries(obj));
const back = Object.fromEntries(map);
console.log(map.get("b"), back);

Натиҷа:

2 {"a":1,"b":2}

Чиро интихоб кардан?

Масъала Бо чӣ ҳал кардан
Тасвири як чиз (корбар, мол) объект {}
Рӯйхат бо тартиб массив []
Шумориш, луғат бо калидҳои дилхоҳ, илова/хориҷкунии зуд-зуд Map
Ягонагӣ, санҷиши тези «ҳаст ё не» Set

Дар дохил чӣ гуна кор мекунад

Set ва Map мисли ҷадвали ҳеш сохта шудаанд: аз рӯи қимати калид фавран ҷое ҳисоб карда мешавад, ки онро аз куҷо ҷустан лозим. Бинобар ин set.has(x) ҳатто барои миллион унсур фавран кор мекунад. Вале array.includes(x) массивро аз аввал мегузарад — барои массиви калон ва санҷишҳои зиёд ин ҳазорҳо маротиба сусттар аст. Агар дар давр санҷед, ки «унсур дар массиви дигар ҳаст ё не» — аввал аз он массив Set созед.

Ягонагӣ дар Set мисли === санҷида мешавад (ба истиснои NaN, ки ба худаш баробар ҳисоб мешавад). Бинобар ин ду объекти гуногуни { a: 1 } дар Set ҳарду мемонанд — инҳо истинодҳои гуногунанд.

Хатоҳои маъмул

  1. Қавсҳои квадратӣ барои Map. map["a"] = 1 хосияти оддӣ месозад, на унсури Map: map.get("a") undefined бармегардонад. set ва get-ро истифода баред.
  2. length ба ҷойи size. Дар Map ва Set — size.
  3. Интизор шудан, ки Set объектҳои якхеларо хориҷ мекунад. new Set([{a: 1}, {a: 1}]).size → 2.
  4. Ба массив табдил доданро фаромӯш карданд. Set map ва filter надорад — аввал [...set].
  5. includes дар давр аз рӯи массивҳои калон. Суст. Set созед ва has-ро истифода баред.

Ёддошт

Set Map
new Set(arr) new Map([[k, v], …])
s.add(x) m.set(k, v)
s.has(x) m.has(k), m.get(k)
s.delete(x) m.delete(k)
s.size m.size
[...s] — ба массив [...m] — массиви ҷуфтҳо
for (const x of s) for (const [k, v] of m)

Бе такрор

Осон+10 XP

Функсияи unique(items)-ро нависед, ки массиви навро бе қиматҳои такроршаванда, бо тартиби пайдоиши аввал бармегардонад.

unique([1, 2, 2, 3, 1])     → [1, 2, 3]
unique(["a", "b", "a"])     → ["a", "b"]

Барои ҳал кардани масъалаҳо коннекторро пайваст кун

Коди масъалаҳо дар компютери худат иҷро мешавад — ин аз браузер тезтар ва боэътимодтар аст. Барои ин барномаи ройгони коннектори CodeWithMe лозим аст. Онро як бор пайваст кардан кифоя аст.

Коннекторро дар ин компютер ҷустуҷӯ мекунем…

  1. 1
    Коннекторро барои системаи худ (Windows, macOS ё Linux) зеркашӣ кун.Зеркашии коннекторДар саҳифаи зеркашӣ файлеро интихоб кун, ки дар номаш системаи ту ҳаст, масалан windows-amd64.
  2. 2Онро иҷро кун ва ҷузвдонеро интихоб кун, ки ҳалҳоят дар он ҷо меистанд. Python ва Node.js-ро ӯ худаш ҳангоми зарурат ба он ҷо мегузорад.
  3. 3
    Дар поён рамзи 6-рақамаро ворид кун — он дар равзанаи коннектор навишта шудааст («Рамз барои сайти CodeWithMe»). Агар браузер дар бораи дастрасӣ ба шабакаи маҳаллӣ пурсад — иҷозат деҳ.

Коннектор кушода аст (рамзи манбаъ дар GitHub), танҳо дар компютери ту кор мекунад ва кодро танҳо пас аз ворид кардани рамзи пайвастшавӣ иҷро мекунад.