Skip to content

Commit 1ad71cb

Browse files
committed
[LOC] Add "recalls" files
Adding "recalls" folder/files, according recalls at end of each block. FS-dev: B-3 / JS basic
1 parent fd53821 commit 1ad71cb

File tree

12 files changed

+1484
-0
lines changed

12 files changed

+1484
-0
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
'use strict';
2+
3+
// Задание 1:
4+
// Напиши функцию высшего порядка createLogger.
5+
// 1. Эта функция должна принимать один аргумент — строку prefix.
6+
// 2. Она должна возвращать новую функцию, которая, в свою очередь, принимает один аргумент — строку message.
7+
// 3. Возвращенная функция должна выводить в консоль сообщение в формате [prefix] message.
8+
9+
function createLogger(prefix) {
10+
if (!prefix || typeof prefix !== 'string') {
11+
return '';
12+
}
13+
14+
return (message) => {
15+
if (!message || typeof message !== 'string') {
16+
return '';
17+
}
18+
19+
return `[${prefix}] ${message}`;
20+
};
21+
}
22+
23+
const infoLogger = createLogger('INFO:');
24+
const errorLogger = createLogger('ERROR:');
25+
26+
console.log(infoLogger('Система успешно запущена')); // [INFO:] Система успешно запущена
27+
console.log(errorLogger('Произошла критическая ошибка')); // [ERROR:] Произошла критическая ошибка
28+
29+
// Задание 2:
30+
// Напиши функцию filterArray, которая:
31+
// Принимает два аргумента:
32+
// 1. arr — массив чисел.
33+
// 2. isEvenCallback — callback-функция.
34+
// Эта isEvenCallback сама принимает одно число и возвращает true, если оно четное, и false, если нечетное.
35+
// Функция filterArray должна вернуть новый массив, содержащий только четные числа из исходного массива arr.
36+
// Важное ограничение: Внутри filterArray нельзя использовать встроенный метод .filter(). Нужно реализовать логику фильтрации самостоятельно, используя цикл.
37+
38+
const numbers = [1, 2, 3, 4, 5, 6];
39+
const isEven = (num) => num % 2 === 0;
40+
41+
function filterArray(arr = [], isEvenCallback) {
42+
if (!arr || arr.length < 1) {
43+
return [];
44+
}
45+
46+
if (!isEvenCallback) {
47+
return [];
48+
}
49+
50+
let evenNum = [];
51+
52+
for (const num of arr) {
53+
if (isEvenCallback(num)) {
54+
evenNum.push(num);
55+
}
56+
}
57+
58+
return evenNum;
59+
}
60+
61+
const evenNumbers = filterArray(numbers, isEven);
62+
console.log(evenNumbers); // [2, 4, 6]
63+
64+
// Задание 3:
65+
// Напиши функцию createChecker(minLength).
66+
// 1. Она принимает один аргумент — minLength (минимальная длина).
67+
// 2. Она возвращает новую функцию (используем замыкание!).
68+
// 3. Эта новая (возвращенная) функция должна принимать строку и возвращать true, если длина строки больше или равна minLength, и false в противном случае.
69+
70+
const words = ['слово', 'буква', 'предложение', 'звук'];
71+
72+
function createChecker(minLength) {
73+
if (!minLength || typeof minLength !== 'number') {
74+
return;
75+
}
76+
77+
return (str) => {
78+
if (!str || typeof str !== 'string') {
79+
return false;
80+
}
81+
82+
if (str.length >= minLength) {
83+
return true;
84+
}
85+
86+
return false;
87+
};
88+
}
89+
90+
// Создаем "проверщик" с минимальной длиной 5
91+
const isLongEnough = createChecker(5);
92+
93+
// Используем его как колбэк для нативного метода .filter()
94+
const longWords = words.filter(isLongEnough);
95+
96+
console.log(longWords); // ["слово", "предложение"]
97+
98+
// Задание 4:
99+
// Давай создадим более сложный "конструктор" функций.
100+
// Напиши функцию createAdvancedMultiplier(factor).
101+
// 1. Она принимает один аргумент — factor (множитель).
102+
// 2. Она возвращает объект, у которого есть два метода:
103+
// - multiply(arr): Этот метод принимает массив чисел arr и возвращает новый массив, где каждое число умножено на factor. (Используй для решения встроенный метод .map()).
104+
// - getFactor(): Этот метод просто возвращает значение factor, которое было "запомнено" при создании.
105+
106+
function createAdvancedMultiplier(factor) {
107+
if (!factor || typeof factor !== 'number') {
108+
return {};
109+
}
110+
111+
return {
112+
multiply: (arr) => arr.map((num) => num * factor),
113+
getFactor: () => factor,
114+
};
115+
}
116+
117+
// Создаем "умножитель" на 3
118+
const multiplierX3 = createAdvancedMultiplier(3);
119+
120+
console.log(multiplierX3.getFactor()); // 3
121+
122+
const numbersArr = [1, 10, 20];
123+
const multipliedNumbers = multiplierX3.multiply(numbersArr);
124+
125+
console.log(multipliedNumbers); // [3, 30, 60]
126+
127+
// Создаем "умножитель" на 10
128+
const multiplierX10 = createAdvancedMultiplier(10);
129+
console.log(multiplierX10.multiply([1, 2, 3])); // Выведет: [10, 20, 30]
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
'use strict';
2+
3+
// Задание 1:
4+
// У тебя есть массив cart, представляющий корзину в интернет-магазине. Каждый элемент — это объект с названием товара, его ценой за штуку (price) и количеством (quantity).
5+
// Твоя задача — посчитать общую стоимость всех товаров в корзине. Постарайся решить это элегантно, с помощью одного из изученных методов перебора.
6+
7+
const cart = [
8+
{ name: 'Apple', price: 0.5, quantity: 4 },
9+
{ name: 'Banana', price: 0.25, quantity: 6 },
10+
{ name: 'Orange', price: 0.75, quantity: 3 },
11+
{ name: 'Milk', price: 2.5, quantity: 1 },
12+
];
13+
14+
const totalCost = cart.reduce(
15+
(acc, product) => acc + product.price * product.quantity,
16+
0
17+
);
18+
19+
console.log(totalCost); // 8.25
20+
21+
// Задание 2:
22+
// У тебя есть список транзакций. Тебе нужно получить массив имен всех клиентов, которые совершили покупки на сумму больше 1000, отсортированный по алфавиту.
23+
24+
const transactions = [
25+
{ id: 1, customer: 'Mike', amount: 1200 },
26+
{ id: 2, customer: 'Sara', amount: 900 },
27+
{ id: 3, customer: 'John', amount: 1500 },
28+
{ id: 4, customer: 'Anna', amount: 1100 },
29+
{ id: 5, customer: 'Mike', amount: 800 },
30+
];
31+
32+
const highSpenders = transactions
33+
.filter((transaction) => transaction.amount > 1000)
34+
.map((transaction) => transaction.customer)
35+
.filter(
36+
(customer, index, currentArr) => currentArr.indexOf(customer) === index
37+
)
38+
.sort((a, b) => a.localeCompare(b));
39+
40+
console.log(highSpenders); // ['Anna', 'John', 'Mike']
41+
42+
// Задание 3:
43+
// У тебя есть массив students, каждый из которых принадлежит к какому-то факультету (faculty). Тебе нужно преобразовать этот массив в объект, где ключами будут названия факультетов, а значениями — массивы студентов, которые на них учатся.
44+
45+
const students = [
46+
{ name: 'Alice', faculty: 'History' },
47+
{ name: 'Bob', faculty: 'Physics' },
48+
{ name: 'Charlie', faculty: 'History' },
49+
{ name: 'David', faculty: 'Math' },
50+
{ name: 'Eve', faculty: 'Physics' },
51+
];
52+
53+
const studentsByFaculty = students.reduce((acc, student) => {
54+
const faculty = student.faculty;
55+
56+
if (!acc[faculty]) {
57+
acc[faculty] = [];
58+
}
59+
60+
acc[faculty].push(student);
61+
62+
return acc;
63+
}, {});
64+
65+
console.log(studentsByFaculty);
66+
/*
67+
{
68+
History: [
69+
{ name: 'Alice', faculty: 'History' },
70+
{ name: 'Charlie', faculty: 'History' }
71+
],
72+
Physics: [
73+
{ name: 'Bob', faculty: 'Physics' },
74+
{ name: 'Eve', faculty: 'Physics' }
75+
],
76+
Math: [
77+
{ name: 'David', faculty: 'Math' }
78+
]
79+
}
80+
*/
81+
82+
// Задание 4:
83+
// Тебе нужно написать функцию createDeck(), которая создает и возвращает стандартную колоду из 52 карт. Карта — это строка вида "Туз Пик" ("Ace of Spades").
84+
// Используй два исходных массива: один для мастей (suits), другой для рангов (ranks). Тебе нужно скомбинировать их, чтобы получить полную колоду. Подумай, как можно решить это с помощью изученных методов перебора, а не обычных циклов for.
85+
86+
function createDeck() {
87+
const suits = ['Hearts', 'Diamonds', 'Clubs', 'Spades'];
88+
const ranks = [
89+
'Ace',
90+
'2',
91+
'3',
92+
'4',
93+
'5',
94+
'6',
95+
'7',
96+
'8',
97+
'9',
98+
'10',
99+
'Jack',
100+
'Queen',
101+
'King',
102+
];
103+
104+
const deck = [];
105+
106+
suits.forEach((suit) => {
107+
ranks.forEach((rank) => {
108+
deck.push(`${rank} of ${suit}`);
109+
});
110+
});
111+
112+
return deck;
113+
}
114+
115+
const deck = createDeck();
116+
117+
console.log(deck.length); // 52
118+
console.log(deck[0]); // "Ace of Hearts"
119+
console.log(deck[51]); // "King of Spades"
120+
121+
// ?? альтернативное решение (через flatMap())
122+
function createDeckFunctional() {
123+
const suits = ['Hearts', 'Diamonds', 'Clubs', 'Spades'];
124+
const ranks = [
125+
'Ace',
126+
'2',
127+
'3',
128+
'4',
129+
'5',
130+
'6',
131+
'7',
132+
'8',
133+
'9',
134+
'10',
135+
'Jack',
136+
'Queen',
137+
'King',
138+
];
139+
140+
return suits.flatMap((suit) => ranks.map((rank) => `${rank} of ${suit}`));
141+
}
142+
143+
// Как это работает:
144+
// 1. Мы вызываем flatMap на массиве мастей suits.
145+
// 2. Для каждой масти (suit), мы запускаем ranks.map, который создает новый массив из 13 карт этой масти (например, ['Ace of Hearts', '2 of Hearts', ...]).
146+
// 3. И тут в дело вступает flatMap: он берет этот созданный массив карт и автоматически "выпрямляет" его, добавляя все 13 карт в итоговый результат. И так для каждой масти.

0 commit comments

Comments
 (0)