Skip to content

Commit 0b2ae82

Browse files
committed
[RS-3.12/st-compl] repetition-session
Solving 4 tasks. Working with "Set/Map/Weak() obj's, main meth's" etc. Worth noting: - all this tasks (note the solutions). FS-dev: B-4 / JS advanced
1 parent c22e6b3 commit 0b2ae82

File tree

1 file changed

+91
-0
lines changed
  • full-stack-dev/4-js-advanced/3-set-and-map/3-12-repetition-session

1 file changed

+91
-0
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
'use strict';
2+
3+
// Задание 1:
4+
// Представь, что мы агрегатор блогов. Нам приходят списки тегов из разных статей. Нам нужно написать функцию mergeTags, которая принимает два массива тегов и возвращает один массив, содержащий только уникальные теги из обоих списков.
5+
// Требования:
6+
// 1. Использовать Set для уникализации.
7+
// 2. Постараться сделать решение максимально лаконичным (в идеале — в одну строку).
8+
// 3. Вернуть именно массив (Array), а не Set.
9+
10+
const tags1 = ['js', 'css', 'html'];
11+
const tags2 = ['css', 'react', 'js'];
12+
13+
function mergeTags(tags1, tags2) {
14+
return [...new Set([...tags1, ...tags2])];
15+
}
16+
17+
console.log(mergeTags(tags1, tags2)); // ['js', 'css', 'html', 'react'];
18+
19+
// Задание 2:
20+
// Напиши функцию countItems, которая принимает массив строк (товаров) и возвращает Map, где ключ — это название товара, а значение — количество его повторений.
21+
// Требования:
22+
// 1. Использовать Map.
23+
// 2. Использовать метод .set() для записи.
24+
// 3. Использовать логику: "Если товара нет — записываем 1, если есть — берем текущее + 1". (Можно через if/else или тернарный оператор — как тебе удобнее).
25+
26+
const cart = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];
27+
28+
function countItems(cart) {
29+
const cartMap = new Map();
30+
31+
for (const item of cart) {
32+
if (!cartMap.has(item)) {
33+
cartMap.set(item, 1);
34+
} else {
35+
const count = cartMap.get(item);
36+
cartMap.set(item, count + 1);
37+
}
38+
}
39+
40+
return cartMap;
41+
}
42+
43+
console.log(countItems(cart)); // Map(3) { 'apple' => 3, 'banana' => 2, 'orange' => 1 }
44+
45+
// Задание 3:
46+
// Напиши функцию processUser(user), которая имитирует "тяжелые вычисления" для пользователя. У нас есть внешняя переменная cache (используй WeakMap).
47+
// Логика функции:
48+
// 1. Если результат для этого user уже есть в cache — вернуть его и вывести в консоль "Взято из кеша".
49+
// 2. Если нет — сгенерировать случайное число (Math.random()), записать его в cache (связав с этим юзером) и вернуть. (Можно вывести "Вычисляю...").
50+
51+
const cache = new WeakMap();
52+
53+
function processUser(user) {
54+
if (cache.has(user)) {
55+
console.log('Взято из кеша');
56+
return cache.get(user);
57+
} else {
58+
const num = Math.random();
59+
cache.set(user, num);
60+
console.log('Вычисляю...');
61+
return num;
62+
}
63+
}
64+
65+
const alex = { name: 'Alex' };
66+
67+
processUser(alex); // "Вычисляю..."
68+
processUser(alex); // "Взято из кеша"
69+
70+
// Задание 4:
71+
// У нас есть объект с зарплатами salaries. Напиши функцию filterSalaries(salariesObj), которая:
72+
// 1. Принимает обычный объект.
73+
// 2. Превращает его в Map (или массив пар), чтобы удобно работать.
74+
// 3. Оставляет (фильтрует) только тех сотрудников, у кого зарплата больше 200.
75+
// 4. Возвращает результат снова в виде обычного объекта.
76+
// Постарайся сделать это максимально элегантно, используя Object.entries и Object.fromEntries.
77+
78+
const salaries = {
79+
John: 100,
80+
Ann: 500,
81+
Pete: 300,
82+
Mary: 150,
83+
};
84+
85+
function filterSalaries(salariesObj) {
86+
return Object.fromEntries(
87+
Object.entries(salariesObj).filter(([name, salary]) => salary > 200)
88+
);
89+
}
90+
91+
console.log(filterSalaries(salaries)); // { Ann: 500, Pete: 300 }

0 commit comments

Comments
 (0)