Skip to content

Commit 8a66385

Browse files
committed
[LES-15.9/st-compl] special-obj-arr-arguments
Practice with func's "arguments". Using "...rest, filter(), for...of". Worth noting: - all this lesson/practice (alternative solution in task 3). FS-dev: B-3 / JS basic
1 parent 575ae08 commit 8a66385

File tree

1 file changed

+115
-0
lines changed
  • full-stack-dev/3-js-basic/15-scope-chain-this/15-9-special-obj-arr-arguments

1 file changed

+115
-0
lines changed
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
'use strict';
2+
3+
// Задание 1:
4+
// Напиши функцию concatStrings().
5+
// - Согласно Arguments, первым идёт separator, — строка, которая будет использоваться как разделитель.
6+
// - Все остальные аргументы — это строки, которые нужно объединить.
7+
// - Функция должна вернуть одну строку, где все строки (кроме первой) соединены через указанный разделитель.
8+
// - Важное условие: реши эту задачу, используя именно объект arguments, без ...rest параметров.
9+
10+
function concatStrings() {
11+
const separator = arguments[0];
12+
13+
return Array.from(arguments).slice(1).join(separator);
14+
}
15+
16+
console.log(concatStrings(', ', 'яблоко', 'банан', 'апельсин')); // "яблоко, банан, апельсин"
17+
18+
// Задание 2:
19+
// А теперь давай посмотрим на современную альтернативу. Перепиши эту же функцию concatStrings, но на этот раз используя остаточные параметры (...rest).
20+
21+
function newConcatStrings(separator, ...strings) {
22+
return strings.join(separator);
23+
}
24+
25+
console.log(concatStrings(', ', 'яблоко', 'банан', 'апельсин')); // "яблоко, банан, апельсин"
26+
27+
// Задание 3:
28+
// Напиши функцию findMostFrequent(), которая принимает произвольное количество аргументов (это могут быть числа или строки). Функция должна найти и вернуть тот аргумент, который встречается чаще всего. Если несколько аргументов встречаются одинаковое максимальное количество раз, можно вернуть любой из них.
29+
// Важно: для решения этой задачи ты можешь использовать любой из двух подходов, который считаешь более удобным (arguments или ...rest).
30+
31+
function findMostFrequent(...args) {
32+
if (args.length === 0) {
33+
return null;
34+
}
35+
36+
const uniqueArgs = args.filter(
37+
(value, index, self) => self.indexOf(value) === index
38+
);
39+
40+
let maxReps = 0;
41+
let mostFrequent;
42+
43+
for (const el of uniqueArgs) {
44+
let reps = 0;
45+
46+
for (const arg of args) {
47+
if (el === arg) reps++;
48+
}
49+
50+
if (reps > maxReps || reps === maxReps) {
51+
maxReps = reps;
52+
mostFrequent = el;
53+
}
54+
}
55+
56+
return { maxReps, mostFrequent };
57+
}
58+
59+
const { maxReps, mostFrequent } = findMostFrequent(
60+
1,
61+
'a',
62+
'a',
63+
'b',
64+
2,
65+
'a',
66+
1,
67+
3,
68+
'a'
69+
);
70+
console.log(
71+
`У значения: ${mostFrequent}, больше всего повторений - ${maxReps}`
72+
); // "У значения: a, больше всего повторений - 4"
73+
74+
// ?? альтернативное решение
75+
function findMostFrequent(...args) {
76+
// 1. Создаём пустой объект для подсчёта частоты каждого элемента.
77+
const counts = {};
78+
79+
// Если аргументов нет, возвращаем undefined.
80+
if (args.length === 0) {
81+
return undefined;
82+
}
83+
84+
// 2. Проходим по всем аргументам ОДИН раз.
85+
for (const arg of args) {
86+
// Для каждого аргумента увеличиваем его счётчик в объекте.
87+
// Если счётчика ещё нет (arg встречается впервые), `counts[arg]` будет undefined.
88+
// `(undefined || 0)` даст `0`, и мы добавим 1.
89+
// Если счётчик уже есть, мы просто добавим 1 к его текущему значению.
90+
counts[arg] = (counts[arg] || 0) + 1;
91+
}
92+
93+
// На этом этапе объект `counts` будет выглядеть так: { '1': 2, 'a': 4, 'b': 1, '2': 1, '3': 1 }
94+
95+
// 3. Находим, какой же элемент (ключ) имеет максимальное значение в счётчике.
96+
let mostFrequent = args[0]; // Предположим, что первый элемент самый частый
97+
let maxCount = 1;
98+
99+
for (const arg in counts) {
100+
if (counts[arg] > maxCount) {
101+
maxCount = counts[arg];
102+
mostFrequent = arg;
103+
}
104+
}
105+
106+
// Важно: ключи в объекте всегда строки. Если нужно вернуть число, а не строку,
107+
// можно сделать дополнительную проверку и преобразование.
108+
// Но для общего случая этого достаточно.
109+
110+
return mostFrequent;
111+
}
112+
113+
// Пример вызова
114+
console.log(findMostFrequent(1, 'a', 'a', 'b', 2, 'a', 1, 3, 'a')); // Выведет: 'a'
115+
console.log(findMostFrequent('apple', 'banana', 'apple')); // Выведет: 'apple'

0 commit comments

Comments
 (0)