|
| 1 | +'use strict'; |
| 2 | + |
| 3 | +// Задание 1: |
| 4 | +// Напишите функцию filterArray(arr, callback). |
| 5 | +// 1. Она должна принимать массив arr и callback-функцию. |
| 6 | +// 2. callback принимает один элемент массива и возвращает true, если элемент "хороший", и false, если он "плохой". |
| 7 | +// 3. Ваша функция filterArray должна вернуть новый массив, содержащий только "хорошие" элементы. |
| 8 | +// 3. Ограничение: Не используйте встроенный .filter(). Используйте цикл (например, for...of). |
| 9 | + |
| 10 | +const numbers = [1, 2, 3, 4, 5]; |
| 11 | +const isEven = (num) => num % 2 === 0; |
| 12 | + |
| 13 | +function filterArray(arr = [], callback) { |
| 14 | + if (!arr) { |
| 15 | + return []; |
| 16 | + } |
| 17 | + |
| 18 | + const evenArr = []; |
| 19 | + |
| 20 | + for (const num of arr) { |
| 21 | + if (callback(num)) { |
| 22 | + evenArr.push(num); |
| 23 | + } |
| 24 | + } |
| 25 | + |
| 26 | + return evenArr; |
| 27 | +} |
| 28 | + |
| 29 | +console.log(filterArray(numbers, isEven)); // [2, 4] |
| 30 | + |
| 31 | +// Задание 2: |
| 32 | +// Напишите функцию-фабрику createMultiplier(factor). |
| 33 | +// 1. Она должна принимать один аргумент factor (число-множитель). |
| 34 | +// 2. Она должна возвращать новую функцию. |
| 35 | +// 3. Эта новая функция, в свою очередь, должна принимать один аргумент number (число). |
| 36 | +// 4. При вызове новая функция должна возвращать результат умножения number на factor, который она "запомнила". |
| 37 | + |
| 38 | +function createMultiplier(factor) { |
| 39 | + if (!factor || typeof factor !== 'number') { |
| 40 | + return () => {}; // или null можно вернуть.. но НЕ NaN как я хотел, т.к. идёт возврат функций |
| 41 | + } |
| 42 | + |
| 43 | + return (number) => { |
| 44 | + if (!number || typeof number !== 'number') { |
| 45 | + return () => {}; // или null можно вернуть.. но НЕ NaN как я хотел, т.к. идёт возврат функций |
| 46 | + } |
| 47 | + |
| 48 | + return number * factor; |
| 49 | + }; |
| 50 | +} |
| 51 | + |
| 52 | +const multiplyByFive = createMultiplier(5); |
| 53 | + |
| 54 | +console.log(multiplyByFive(10)); // 50 |
| 55 | +console.log(multiplyByFive(3)); // 15 |
| 56 | +console.log(createMultiplier(2)(8)); // 16 |
| 57 | + |
| 58 | +// Задание 3: |
| 59 | +// Давайте объединим то, что мы только что сделали, со встроенными функциями высшего порядка. Это очень распространенный паттерн (как arr.filter(inBetween(3, 6)) в вашем уроке ). |
| 60 | +// 1. Возьмите вашу функцию createMultiplier(factor) из предыдущей задачи. |
| 61 | +// 2. Создайте массив const numbers = [10, 20, 30];. |
| 62 | +// 3. Создайте "специализированную" функцию const triple = createMultiplier(3);. |
| 63 | +// 4. Теперь, используя метод .map() и передав ему напрямую вашу функцию triple, получите новый массив, в котором каждое число утроено. |
| 64 | + |
| 65 | +const arr = [10, 20, 30]; |
| 66 | +const triple = createMultiplier(3); |
| 67 | + |
| 68 | +const tripleArr = arr.map(triple); |
| 69 | +console.log(tripleArr); // [30, 60, 90] |
| 70 | + |
| 71 | +// Задание 4: |
| 72 | +// Напишите функцию fetchUserData(callback), которая имитирует запрос на сервер: |
| 73 | +// 1. Она принимает callback-функцию. |
| 74 | +// 2. Внутри она должна сгенерировать const randomNum = Math.random();. |
| 75 | +// 3. Имитируйте задержку в 1 секунду с помощью setTimeout. |
| 76 | +// 4. Логика внутри setTimeout: |
| 77 | +// - Успех: Если randomNum > 0.5, вызовите callback, передав null (для ошибки) и "успешные" данные (например, { name: 'Alice', id: 1 }). |
| 78 | +// - Ошибка: Если randomNum <= 0.5 (используйте else для надежности!), вызовите callback, передав new Error('Server error') (для ошибки) и null (для данных). |
| 79 | +// 5. Вызов: Вызовите fetchUserData и передайте ей колбэк, который правильно обрабатывает оба случая ("Error-first"): |
| 80 | +// - Если err есть, он должен вывести в консоль сообщение об ошибке (например, err.message). |
| 81 | +// - Если err нет, он должен вывести в консоль полученные data. |
| 82 | +// Подсказка: Вспомните, как выглядел outputData(err, data) в вашем уроке 10.2 . |
| 83 | + |
| 84 | +function fetchUserData(callback) { |
| 85 | + const randomNum = Math.random(); |
| 86 | + |
| 87 | + setTimeout(() => { |
| 88 | + if (randomNum > 0.5) { |
| 89 | + callback(null, { name: 'Alice', id: 1 }); |
| 90 | + } else { |
| 91 | + callback(new Error('Server error'), null); |
| 92 | + } |
| 93 | + }, 1000); |
| 94 | +} |
| 95 | + |
| 96 | +fetchUserData((err, data) => { |
| 97 | + if (err) { |
| 98 | + console.error(err.message); |
| 99 | + } else { |
| 100 | + console.log(data); // можно и без else блока.. просто console.log(data); |
| 101 | + } |
| 102 | +}); |
0 commit comments