|
| 1 | +'use strict'; |
| 2 | + |
| 3 | +// Задание 1: |
| 4 | +// У вас есть массив permissions, который хранит список прав доступа пользователя. const permissions = ['READ', 'WRITE', 'DELETE', 'SHARE']; |
| 5 | +// Вам нужно написать функцию grantAdminAccess(arr), которая добавляет право 'ADMIN' в начало списка и убирает право 'SHARE' из конца списка. |
| 6 | +// Требования: |
| 7 | +// 1. Функция должна мутировать (изменять) исходный массив. |
| 8 | +// 2. Функция должна использовать методы, предназначенные для работы с началом и концом массива (из файла 8.2). |
| 9 | +// 3. Функция должна вернуть удаленный элемент ('SHARE'). |
| 10 | + |
| 11 | +const permissions = ['READ', 'WRITE', 'DELETE', 'SHARE']; |
| 12 | + |
| 13 | +function grantAdminAccess(arr = []) { |
| 14 | + if (!arr) { |
| 15 | + return []; |
| 16 | + } |
| 17 | + |
| 18 | + arr.unshift('ADMIN'); // [ 'ADMIN', 'READ', 'WRITE', 'DELETE', 'SHARE' ] |
| 19 | + |
| 20 | + return arr.pop(); |
| 21 | +} |
| 22 | + |
| 23 | +console.log(grantAdminAccess(permissions)); // SHARE |
| 24 | + |
| 25 | +// Задание 2: |
| 26 | +// У вас есть два списка: coreFeatures (основные функции) и experimentalFeatures (экспериментальные). |
| 27 | +// const coreFeatures = ['Login', 'Dashboard']; и const experimentalFeatures = ['Analytics', 'Chat']; |
| 28 | +// Вам нужно написать функцию combineFeatures(core, experimental), которая возвращает один новый массив, содержащий сначала все coreFeatures, а затем все experimentalFeatures. |
| 29 | +// Требования: |
| 30 | +// 1. Функция не должна изменять (мутировать) исходные массивы coreFeatures и experimentalFeatures. |
| 31 | +// 2. Используйте методы, которые не мутируют исходные массивы (из файла 8.4). |
| 32 | + |
| 33 | +const coreFeatures = ['Login', 'Dashboard']; |
| 34 | +const experimentalFeatures = ['Analytics', 'Chat']; |
| 35 | + |
| 36 | +function combineFeatures(core = [], experimental = []) { |
| 37 | + if (!core || !experimental) { |
| 38 | + return []; |
| 39 | + } |
| 40 | + |
| 41 | + return [...core, ...experimental]; |
| 42 | +} |
| 43 | + |
| 44 | +console.log(combineFeatures(coreFeatures, experimentalFeatures)); // [ 'Login', 'Dashboard', 'Analytics', 'Chat' ] |
| 45 | + |
| 46 | +// Задание 3: |
| 47 | +// У вас есть массив logEntries, в котором хранятся все действия пользователя. const logEntries = ['user_login', 'view_page', 'click_button', 'user_logout', 'error_404']; |
| 48 | +// Вам нужно написать функцию getLastImportantLogs(logs, count), которая возвращает новый массив, содержащий count последних логов. |
| 49 | +// Требования: |
| 50 | +// 1. Функция не должна изменять исходный массив logEntries. |
| 51 | +// 2. Используйте метод, который позволяет "вырезать" часть массива, не мутируя его (из файла 8.4). |
| 52 | +// 3. Функция должна корректно работать с отрицательными индексами (подсказка из файла 8.4). |
| 53 | +// Пример вызова: getLastImportantLogs(logEntries, -2) должен вернуть ['user_logout', 'error_404']. |
| 54 | + |
| 55 | +const logEntries = [ |
| 56 | + 'user_login', |
| 57 | + 'view_page', |
| 58 | + 'click_button', |
| 59 | + 'user_logout', |
| 60 | + 'error_404', |
| 61 | +]; |
| 62 | + |
| 63 | +function getLastImportantLogs(logs = [], count = 0) { |
| 64 | + if (!logs || !count) { |
| 65 | + return []; |
| 66 | + } |
| 67 | + |
| 68 | + return logs.slice(-count); |
| 69 | +} |
| 70 | + |
| 71 | +console.log(getLastImportantLogs(logEntries, 2)); // [ 'user_logout', 'error_404' ] |
| 72 | + |
| 73 | +// Задание 4: |
| 74 | +// У вас есть строка с тегами, разделенными запятыми и пробелами. const tagsString = 'js, react, node, http, css'; |
| 75 | +// Вам нужно написать функцию parseTags(str), которая превращает эту строку в массив тегов. |
| 76 | +// Требования: |
| 77 | +// 1. Функция должна вернуть массив. |
| 78 | +// 2. Используйте метод, который "разрезает" строку на части (из файла 8.5). |
| 79 | +// 3. Обратите внимание, что разделитель — это не просто запятая, а запятая И пробел. |
| 80 | +// Ожидаемый результат: ['js', 'react', 'node', 'http', 'css'] |
| 81 | + |
| 82 | +const tagsString = 'js, react, node, http, css'; |
| 83 | + |
| 84 | +function parseTags(str) { |
| 85 | + if (!str || typeof str !== 'string') { |
| 86 | + return ''; |
| 87 | + } |
| 88 | + |
| 89 | + return str.split(', '); |
| 90 | +} |
| 91 | + |
| 92 | +console.log(parseTags(tagsString)); // [ 'js', 'react', 'node', 'http', 'css' ] |
| 93 | + |
| 94 | +// Задание 5: |
| 95 | +// Эта задача основана на материалах 8.3 и 8.9 ("Два интереснейших примера"). Вам нужно найти все вхождения элемента в массив, а не только первое. |
| 96 | +// const logLevels = ['INFO', 'DEBUG', 'INFO', 'ERROR', 'WARNING', 'INFO']; |
| 97 | +// Напишите функцию findAllIndexes(arr, item), которая принимает массив и элемент, а возвращает массив всех индексов, по которым этот элемент найден. |
| 98 | +// Требования: |
| 99 | +// 1. Если элемент не найден, вернуть пустой массив []. |
| 100 | +// 2. Вы должны использовать indexOf() для поиска. |
| 101 | +// 3. Подвох (намек): indexOf() находит только первое вхождение. Вам понадобится использовать indexOf() в цикле и его второй аргумент (fromIndex), чтобы продолжать поиск, не находя один и тот же элемент снова и снова. |
| 102 | +// Пример вызова: findAllIndexes(logLevels, 'INFO') должен вернуть [0, 2, 5]. |
| 103 | + |
| 104 | +const logLevels = ['INFO', 'DEBUG', 'INFO', 'ERROR', 'WARNING', 'INFO']; |
| 105 | + |
| 106 | +function findAllIndexes(arr = [], item) { |
| 107 | + if (!arr || !item || typeof item !== 'string') { |
| 108 | + return []; |
| 109 | + } |
| 110 | + |
| 111 | + const indexArr = []; |
| 112 | + let index = 0; |
| 113 | + |
| 114 | + while (true) { |
| 115 | + let currentIndex = arr.indexOf(item, index); |
| 116 | + |
| 117 | + if (currentIndex === -1) { |
| 118 | + break; |
| 119 | + } |
| 120 | + |
| 121 | + indexArr.push(currentIndex); |
| 122 | + index = currentIndex + 1; |
| 123 | + } |
| 124 | + |
| 125 | + return indexArr; |
| 126 | +} |
| 127 | + |
| 128 | +console.log(findAllIndexes(logLevels, 'INFO')); // [ 0, 2, 5 ] |
| 129 | + |
| 130 | +// Задание 6: |
| 131 | +// У вас есть массив urlParts, который представляет собой разобранный URL. const urlParts = ['https', 'purpleschool.ru', 'courses', 'javascript', 'lesson-8']; |
| 132 | +// Вам нужно написать функцию getProtocolAndPath(arr), которая: |
| 133 | +// 1. Забирает первый элемент в переменную protocol. |
| 134 | +// 2. Забирает второй элемент в переменную domain. |
| 135 | +// 3. Всё остальное (['courses', 'javascript', 'lesson-8']) собирает в новый массив с именем path. |
| 136 | +// 4. Функция должна вернуть строку в формате: "Протокол: [protocol], Домен: [domain], Путь: [path]". (Для path можете использовать JSON.stringify, чтобы он красиво вывелся как массив). |
| 137 | +// Требования: |
| 138 | +// 1. Используйте деструктуризацию для "распаковки" массива arr. |
| 139 | +// 2. Используйте оператор ...rest для сбора path. |
| 140 | +// Пример вызова: getProtocolAndPath(urlParts) должен вернуть строку, похожую на: "Протокол: https, Домен: purpleschool.ru, Путь: ["courses","javascript","lesson-8"]" |
| 141 | + |
| 142 | +const urlParts = [ |
| 143 | + 'https', |
| 144 | + 'purpleschool.ru', |
| 145 | + 'courses', |
| 146 | + 'javascript', |
| 147 | + 'lesson-8', |
| 148 | +]; |
| 149 | + |
| 150 | +function getProtocolAndPath(arr = []) { |
| 151 | + if (!arr) { |
| 152 | + return []; |
| 153 | + } |
| 154 | + |
| 155 | + const [protocol, domain, ...path] = arr; |
| 156 | + |
| 157 | + return `Протокол: ${protocol}, Домен: ${domain}, Путь: ${JSON.stringify( |
| 158 | + path |
| 159 | + )}`; |
| 160 | +} |
| 161 | + |
| 162 | +console.log(getProtocolAndPath(urlParts)); // "Протокол: https, Домен: purpleschool.ru, Путь: ["courses","javascript","lesson-8"]" |
0 commit comments