Skip to content

Commit 2870422

Browse files
committed
[REC-8/st-compl] arrays, 2-nd
Solving 6 tasks. Working with "unshift/pop(), [...spread], indexOf()". Worth noting: - tasks 5: finding all equal entries in an array. FS-dev: B-3 / JS basic
1 parent aa9d25e commit 2870422

File tree

2 files changed

+162
-0
lines changed

2 files changed

+162
-0
lines changed

full-stack-dev/3-js-basic/8-arrays/recall/recall.js renamed to full-stack-dev/3-js-basic/8-arrays/recall/1-first/recall.js

File renamed without changes.
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
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

Comments
 (0)