Skip to content

Commit aa9d25e

Browse files
committed
[REC-7/st-compl] functions, 2-nd
Solving 4 tasks. Working with "helper func's, map/filter(), forEach()". Worth noting: - all this tasks (note the solutions). FS-dev: B-3 / JS basic
1 parent 1ffffdb commit aa9d25e

File tree

2 files changed

+135
-0
lines changed

2 files changed

+135
-0
lines changed

full-stack-dev/3-js-basic/7-functions/recall/recall.js renamed to full-stack-dev/3-js-basic/7-functions/recall/1-first/recall.js

File renamed without changes.
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
'use strict';
2+
3+
// Задание 1:
4+
// Напиши функцию getWelcomeMessage.
5+
// 1. Функция должна принимать два параметра: name и age.
6+
// 2. Параметр name должен иметь значение по умолчанию "Гость" (используй синтаксис ES6) .
7+
// 3. Функция должна использовать паттерн "раннего возврата" (Early Return). Если age меньше 18, функция должна немедленно вернуть строку "Доступ запрещен".
8+
// 4. Если проверка пройдена (т.е. возраст 18+), функция должна вернуть строку "Добро пожаловать, [name]!".
9+
10+
function getWelcomeMessage(name = 'Гость', age) {
11+
if (!age || age < 18) {
12+
return 'Доступ запрещен';
13+
}
14+
15+
name = name.trim();
16+
name = name[0].toUpperCase() + name.toLowerCase().slice(1);
17+
18+
return `Добро пожаловать, ${name}!`;
19+
}
20+
21+
console.log(getWelcomeMessage(' rOnI ', 18));
22+
('Добро пожаловать, Roni!'); // Добро пожаловать, Roni!
23+
24+
// Задание 2:
25+
// У нас есть массив "грязных" данных — строки с пробелами и разным регистром. Нам нужно получить массив "чистых" имён, которые длиннее 3-х символов.
26+
// const dirtyNames = [' John ', ' ANNA', ' al', ' Peter '];
27+
// 1. Напиши вспомогательную (helper) функцию formatName(name).
28+
// - Она должна принимать одну строку (name).
29+
// -- Убрать пробелы в начале и в конце (например, .trim()).
30+
// -- Привести имя к формату: первая буква заглавная, остальные — строчные (например, "Anna", "Peter").
31+
// - Она должна вернуть (return) отформатированную строку.
32+
// 2. Напиши основную функцию getValidNames(names).
33+
// - Она должна использовать formatName и методы массивов (.map() и .filter()), чтобы:
34+
// -- Отформатировать каждое имя в массиве.
35+
// -- Оставить (отфильтровать) только те имена, чья длина (после форматирования) больше 3 символов.
36+
// - Используй стрелочные функции для колбэков в .map() и .filter().
37+
// Ожидаемый результат: console.log(getValidNames(dirtyNames)) должен вывести ['John', 'Anna', 'Peter'].
38+
39+
const dirtyNames = [' John ', ' ANNA', ' al', ' Peter ', '', ' '];
40+
41+
// helper
42+
function formatName(name) {
43+
if (!name || name.trim().length < 2) {
44+
return '';
45+
}
46+
47+
name = name.trim();
48+
name = name[0].toUpperCase() + name.toLowerCase().slice(1);
49+
50+
return name;
51+
}
52+
53+
function getValidNames(names = []) {
54+
if (!names) {
55+
return [];
56+
}
57+
58+
return names
59+
.map((name) => formatName(name))
60+
.filter((name) => name.length > 3);
61+
}
62+
63+
console.log(getValidNames(dirtyNames)); // [ 'John', 'Anna', 'Peter' ]
64+
65+
// Задание 3:
66+
// Напиши функцию calculateOrder(price, options).
67+
// 1. price — это обязательное число (цена товара).
68+
// 2. options — это объект с настройками, который не является обязательным.
69+
// 3. Используй деструктуризацию прямо в параметрах, чтобы "вытащить" из options два свойства:
70+
// - discount (число), по умолчанию 0.
71+
// - tax (число), по умолчанию 0.21 (т.е. 21% НДС).
72+
// 4. Используй "трюк" = {}, чтобы функция не ломалась, если options вообще не передали.
73+
// 5. Функция должна вернуть итоговую цену по формуле: price - (price * discount) + (price * tax).
74+
75+
function calculateOrder(price, { discount = 0, tax = 0.21 } = {}) {
76+
if (!price) {
77+
return 0;
78+
}
79+
80+
return price - price * discount + price * tax;
81+
}
82+
83+
console.log(calculateOrder(100)); // 121
84+
console.log(calculateOrder(100, { discount: 0.1 })); // 111
85+
console.log(calculateOrder(100, { tax: 0.05 })); // 105
86+
87+
// Задание 4:
88+
// Представь, что у нас есть система, которая генерирует серию отложенных приветствий. У нас есть массив объектов users.
89+
/*
90+
const users = [
91+
{ name: 'Alex', delay: 1500 },
92+
{ name: 'Anna', delay: 500 },
93+
{ name: '', delay: 1000 } // Невалидный пользователь
94+
];
95+
*/
96+
// Нам нужно написать "основную" функцию scheduleGreetings(users), которая переберёт этот массив и для каждого пользователя:
97+
// 1. Немедленно вызовет вспомогательную функцию isValidUser(user).
98+
// 2. Если пользователь невалидный, scheduleGreetings должна пропустить его.
99+
// 3. Если пользователь валидный, scheduleGreetings должна использовать setTimeout (который, как ты помнишь, создаёт "проблему this и var" ), чтобы вывести в консоль Привет, [name]! через user.delay миллисекунд.
100+
// Твои задачи:
101+
// 1. Напиши вспомогательную функцию isValidUser(user):
102+
// - Она должна использовать "ранний возврат".
103+
// - Она должна возвращать false, если !user или !user.name.
104+
// - Во всех остальных случаях — true.
105+
// 2. Напиши основную функцию scheduleGreetings(users):
106+
// - Она должна использовать forEach для перебора.
107+
// - Она должна использовать isValidUser для "раннего" пропуска.
108+
// - Внутри forEach, используй setTimeout.
109+
// Внимание (главная часть): Внутри setTimeout используй стрелочную функцию для колбэка, чтобы избежать любых проблем с this или var, и правильно вывести имя пользователя.
110+
// Ожидаемый результат в консоли: Сначала (через 0.5 сек): Привет, Anna! Потом (через 1.5 сек): Привет, Alex! (Пустая строка должна быть проигнорирована)
111+
112+
const users = [
113+
{ name: 'Alex', delay: 1500 },
114+
{ name: 'Anna', delay: 500 },
115+
{ name: '', delay: 1000 }, // Невалидный пользователь
116+
];
117+
118+
// helper
119+
function isValidUser(user) {
120+
if (!user || !user.name) {
121+
return false;
122+
}
123+
124+
return true;
125+
}
126+
127+
function scheduleGreetings(users = []) {
128+
users.forEach((user) => {
129+
if (isValidUser(user)) {
130+
setTimeout(() => console.log(`Привет, ${user.name}!`), user.delay);
131+
}
132+
});
133+
}
134+
135+
scheduleGreetings(users); // "Привет, Anna!", "Привет, Alex!"

0 commit comments

Comments
 (0)