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