Skip to content

Commit c22e6b3

Browse files
committed
[TM-3.11/compl] training-module
Solving +7 tasks. Working with "new Map/Weak() obj's, main meth's" etc. Worth noting: - all this tasks (note the solutions). FS-dev: B-4 / JS advanced
1 parent d02f8c3 commit c22e6b3

File tree

1 file changed

+146
-0
lines changed
  • full-stack-dev/4-js-advanced/3-set-and-map/3-11-training-module

1 file changed

+146
-0
lines changed

full-stack-dev/4-js-advanced/3-set-and-map/3-11-training-module/training.js

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,149 @@ function getUniqueTags(tags) {
1717
}
1818

1919
console.log(getUniqueTags(rawTags)); // ['javascript', 'css', 'html', 'react']
20+
21+
// Задание 2:
22+
// Нам нужно создать простое хранилище настроек.
23+
// 1. Создай переменную settings через new Map().
24+
// 2. Добавь в неё данные (используя метод .set()):
25+
// - Ключ 1 (число) -> Значение 'Admin ID'
26+
// - Ключ 'theme' (строка) -> Значение 'dark'
27+
// - Ключ true (булево) -> Значение 'isActive'
28+
// 3. Выведи в консоль значение, которое лежит под ключом 1 (число).
29+
// 4. Выведи в консоль значение, которое лежит под ключом 'theme'.
30+
// Цель: Привыкнуть к методам .set() и .get() и убедиться, что число 1 работает как ключ.
31+
32+
const settings = new Map();
33+
34+
settings.set(1, 'Admin ID');
35+
settings.set('theme', 'dark');
36+
settings.set(true, 'isActive');
37+
38+
console.log(settings.get(1)); // "Admin ID"
39+
console.log(settings.get('theme')); // "dark"
40+
41+
// Задание 3:
42+
// 1. Дан обычный объект prices.
43+
// 2. Создай переменную priceMap (типа Map), инициализировав её данными из prices. Подсказка: используй Object.entries(prices) внутри конструктора new Map(...).
44+
// 3. Добавь в этот Map новый товар: orange с ценой 300.
45+
// 4. Преобразуй полученный Map обратно в обычный объект updatedPrices. Подсказка: используй Object.fromEntries(...).
46+
// 5. Выведи updatedPrices в консоль.
47+
48+
const prices = {
49+
banana: 100,
50+
apple: 200,
51+
};
52+
53+
const priceMap = new Map(Object.entries(prices));
54+
priceMap.set('orange', 300);
55+
56+
const updatedPrices = Object.fromEntries(priceMap);
57+
console.log(updatedPrices); // { banana: 100, apple: 200, orange: 300 }
58+
59+
// Задание 4:
60+
// У нас есть Map с инвентарем магазина (товар -> количество).
61+
// 1. Напиши цикл for...of, который перебирает inventory.
62+
// 2. Используй деструктуризацию [item, qty] прямо в круглых скобках цикла.
63+
// 3. Внутри цикла выведи строку: Товар: Mice, Остаток: 10 (и так для каждого).
64+
65+
const inventory = new Map([
66+
['Mice', 10],
67+
['Keyboards', 5],
68+
['Monitors', 2],
69+
]);
70+
71+
for (const [item, qty] of inventory) {
72+
console.log(`Товар: ${item}, Остаток: ${qty}`);
73+
}
74+
/*
75+
Товар: Mice, Остаток: 10
76+
Товар: Keyboards, Остаток: 5
77+
Товар: Monitors, Остаток: 2
78+
*/
79+
80+
// Задание 5:
81+
// 1. Создай объект пользователя: const userBob = { name: 'Bob' };.
82+
// 2. Создай пустой Map visits.
83+
// 3. Запиши в visits, что userBob был у нас 10 раз. (Ключ — переменная userBob).
84+
// 4. Попробуй получить данные, используя новый объект с теми же данными: console.log(visits.get({ name: 'Bob' }));.
85+
// 5. Попробуй получить данные, используя правильную ссылку: console.log(visits.get(userBob));.
86+
// В комментариях к коду напиши, что выведет консоль в пунктах 4 и 5 (undefined или 10), и почему.
87+
88+
const userBob = { name: 'Bob' };
89+
const visits = new Map();
90+
91+
visits.set(userBob, 10);
92+
93+
console.log(visits.get({ name: 'Bob' })); // undefined
94+
console.log(visits.get(userBob)); // 10
95+
96+
// Задание 6:
97+
// Мы хотим хранить секретные данные пользователя, пока он существует в системе.
98+
// 1. Создай let user = { name: 'Secret Agent' };.
99+
// 2. Создай const secretStorage = new WeakMap();.
100+
// 3. Запиши данные: ключ — user, значение — "super_secret_key".
101+
// 4. Проверь наличие данных через .has(user) (выведи в консоль).
102+
// 5. Теперь сымитируй удаление пользователя: user = null;.
103+
// 6. Вопрос на понимание: Напиши в комментарии, можем ли мы теперь как-то получить "super_secret_key" из secretStorage? И почему?
104+
105+
let user = { name: 'Secret Agent' };
106+
const secretStorage = new WeakMap();
107+
108+
secretStorage.set(user, 'super_secret_key');
109+
console.log(secretStorage.has(user)); // true
110+
111+
user = null;
112+
113+
setTimeout(() => {
114+
console.log(secretStorage.has(user)); // false
115+
}, 100);
116+
117+
// Задание 7:
118+
// Напиши функцию processUser(user), которая имитирует сложные вычисления.
119+
// 1. Создай внешнюю переменную cache (через WeakMap).
120+
// 2. Напиши функцию processUser(user), которая:
121+
// - Шаг А: Проверяет, есть ли результат для этого user в cache. Если есть — возвращает его (и выводит в консоль "Взято из кеша").
122+
// - Шаг Б: Если нет — генерирует случайное число (Math.random()), сохраняет его в cache для этого юзера и возвращает (выводит в консоль "Вычисляю...").
123+
// 3. Создай объект alex = { name: 'Alex' }.
124+
// 4. Вызови функцию 2 раза подряд для alex.
125+
// Ожидание: первый раз — "Вычисляю...", второй раз — "Взято из кеша".
126+
127+
const cache = new WeakMap();
128+
129+
function processUser(user) {
130+
if (cache.has(user)) {
131+
console.log('Взято из кеша');
132+
return cache.get(user);
133+
} else {
134+
const num = Math.random();
135+
cache.set(user, num);
136+
console.log('Вычисляю...');
137+
return num;
138+
}
139+
}
140+
141+
const alex = { name: 'Alex' };
142+
143+
processUser(alex); // "Вычисляю..."
144+
processUser(alex); // "Взято из кеша"
145+
146+
// Задание 8:
147+
// Мы делаем чат. Нужно помечать сообщения как "прочитанные", не меняя сами объекты сообщений (не добавляя в них свойство isRead: true).
148+
// 1. Создай два объекта сообщений: let msg1 = { text: 'Привет!' }; let msg2 = { text: 'Как дела?' };
149+
// 2. Создай коллекцию readMessages, используя WeakSet.
150+
// 3. Пользователь прочитал первое сообщение: добавь msg1 в readMessages.
151+
// 4. Напиши функцию isRead(msg), которая принимает сообщение и возвращает true (если прочитано) или false (если нет).
152+
// 5. Проверь оба сообщения через эту функцию и выведи результат.
153+
154+
const msg1 = { text: 'Привет!' };
155+
const msg2 = { text: 'Как дела?' };
156+
157+
const readMessages = new WeakSet();
158+
readMessages.add(msg1);
159+
160+
function isRead(msg) {
161+
return readMessages.has(msg);
162+
}
163+
164+
console.log(isRead(msg1)); // true
165+
console.log(isRead(msg2)); // false

0 commit comments

Comments
 (0)