JavaScript · Синтаксис · Початковий рівень

Set, об'єкти, обробка помилок

15 завдань

Практика JavaScript з Set, об'єктами та обробкою помилок: унікальні значення, загальні символи, try/catch, безпечне оброблення даних, групування слів та аналіз рядків.

Множини — унікальність і операції над множинами

#
Set — це колекція унікальних значень. Додавання одного й того самого значення двічі не має ефекту — дублікати мовчки ігноруються. ```javascript const numbers = [1, 2, 2, 3, 3, 3]; const unique = new Set(numbers); console.log([...unique]); // [1, 2, 3] ``` new Set(array) створює множину з масиву. Оператор розширення ... перетворює її назад на масив. Перевірка входження через has() набагато швидша, ніж через includes() на масиві, особливо для великих колекцій: ```javascript const allowed = new Set(["admin", "editor", "viewer"]); if (allowed.has(userRole)) { // дати доступ } ``` Операції над множинами — JavaScript не має вбудованих операторів & і |, але їх можна скласти через filter і розширення: ```javascript const a = new Set([1, 2, 3, 4]); const b = new Set([3, 4, 5, 6]); // Перетин — елементи в обох const intersection = new Set([...a].filter(x => b.has(x))); // Об'єднання — елементи в будь-якій const union = new Set([...a, ...b]); // Різниця — є в a, але не в b const difference = new Set([...a].filter(x => !b.has(x))); ``` Пошук спільних символів між двома рядками: ```javascript function commonChars(s1, s2) { const set1 = new Set(s1); const set2 = new Set(s2); return [...set1].filter(c => set2.has(c)); } ``` new Set(string) ітерує рядок і зберігає кожен унікальний символ. filter залишає лише ті, що є в другій множині. Коли використовувати Set замість масиву: коли потрібна унікальність, швидка перевірка входження або множинні операції. Коли важливий порядок або потрібні дублікати — залишайтеся з масивом.

Патерни об'єктів — групування і фільтрація

#
Звичайні об'єкти {} — це словники JavaScript. У цих завданнях функції отримують і повертають об'єкти, тому ключові операції — ітерація і трансформація. Групування елементів за властивістю — будуємо об'єкт, де ключ — це група, а значення — масив: ```javascript function firstLetterStats(words) { const result = {}; for (const word of words) { const letter = word[0]; if (!(letter in result)) { result[letter] = []; } result[letter].push(word); } return result; } ``` Фільтрація об'єкта — будуємо новий об'єкт лише з елементами, що проходять умову. Object.entries() дає пари [ключ, значення]: ```javascript function adultsOnly(data) { const result = {}; for (const [name, age] of Object.entries(data)) { if (age > 18) { result[name] = age; } } return result; } ``` Обмін ключів і значень — працює, тільки якщо значення унікальні: ```javascript function swapDict(obj) { const result = {}; for (const [k, v] of Object.entries(obj)) { result[v] = k; } return result; } ``` Видалення null/undefined-значень: ```javascript function removeNulls(obj) { const result = {}; for (const [k, v] of Object.entries(obj)) { if (v !== null && v !== undefined) { result[k] = v; } } return result; } ``` Використовуйте строгу рівність !== null — вона явно вказує на намір, навіть якщо != null теж зловило б undefined.

Обробка помилок за допомогою try/catch

#
Винятки в JavaScript сигналізують про те, що щось пішло не так під час виконання. parseInt("hello") не кидає помилку — воно повертає NaN — але багато інших операцій кидають: звернення до властивості null або undefined викликає TypeError, JSON.parse з некоректним рядком — SyntaxError. try/catch дозволяє реагувати на виняток замість падіння: ```javascript function safeSum(text) { let total = 0; for (const part of text.split(" ")) { try { const n = Number(part); if (isNaN(n)) throw new Error("not a number"); total += n; } catch (e) { // пропускаємо частини, що не є числами } } return total; } ``` Блок try містить код, що може зазнати невдачі. Якщо кидається виняток — виконання переходить до catch. Об'єкт помилки e доступний всередині catch — можна перевірити e.message для деталей. Поширений патерн: спробувати розібрати ввід, за невдачі повернутися до значення за замовчуванням: ```javascript try { const data = JSON.parse(rawInput); process(data); } catch (e) { console.log("Некоректний JSON, використовуємо значення за замовчуванням"); process({}); } ``` Блок finally виконується завжди — навіть якщо виняток було кинуто: ```javascript try { riskyOperation(); } catch (e) { console.log("Помилка:", e.message); } finally { cleanup(); // виконується завжди } ``` Використовуйте try/catch для справді виключних ситуацій — некоректний ввід, мережеві збої, розбір JSON. Не використовуйте його замість перевірки умов, які можна перевірити безпосередньо (наприклад array.length > 0 перед доступом до array[0]).
01

Унікальні додатні значення.

#

Напишіть функцію, яка приймає масив чисел і повертає Set унікальних додатних значень.

function uniquePositive(nums) {
    // ваш код тут
}
Рішення
function uniquePositive(nums) {
    let result = new Set([]);
    for (let n of nums) {
        if (n > 0) {
            result.add(n);
        }
    }
    return result;
}

// або так можна: перевірку на додатність зробити перед додаванням у Set
let numbers = [1, -2, 3, 1, 0, 3, 5];
let result = new Set();

for (let n of numbers) {
    if (n > 0) {
        result.add(n);
    }
}

console.log(result);
02

Спільні символи двох рядків.

#

Напишіть функцію, яка приймає два рядки і повертає Set спільних символів.

function commonChars(a, b) {
    // ваш код тут
}
Рішення
function commonChars(a, b) {
    return new Set([...a].filter(char => new Set(b).has(char)));
}
03

Середня ціна товарів.

#

Напишіть функцію, яка приймає об’єкт із цінами товарів і повертає середню ціну. Якщо об’єкт порожній — поверніть 0.

function averagePrice(prices) {
    // ваш код тут
}
Рішення
function averagePrice(prices) {
    const values = Object.values(prices);
    if (values.length === 0) {
        return 0;
    }

    let total = 0;
    for (let price of values) {
        total += price;
    }

    return total / values.length;
}
04

Сума чисел із рядка.

#

Напишіть функцію, яка приймає рядок із числами, розділеними пробілами, і повертає суму цих чисел. Якщо зустрічається не число — пропускайте його.

function safeSum(text) {
    // ваш код тут
}
Рішення
function safeSum(text) {
    let total = 0;

    for (let part of text.trim().split(/\s+/)) {
        const value = Number(part);
        if (!Number.isNaN(value)) {
            total += value;
        }
    }

    return total;
}
05

Групування за першою літерою.

#

Напишіть функцію, яка приймає масив слів і повертає об’єкт, де: - ключ — перша літера слова - значення — кількість слів, що починаються з цієї літери

function firstLetterStats(words) {
    // ваш код тут
}
Рішення
function firstLetterStats(words) {
    let result = {};

    for (let w of words) {
        if (!w) {
            continue;
        }

        let key = w[0];

        if (key in result) {
            result[key] += 1;
        } else {
            result[key] = 1;
        }
    }

    return result;
}
06

Перетин і різниця Set.

#

Напишіть функцію, яка приймає два Set і повертає: - їхній перетин - їхню різницю (перший мінус другий)

function setOperations(a, b) {
    // ваш код тут
}
Рішення
function setOperations(a, b) {
    return {
        intersection: new Set(
            [...a].filter(value => b.has(value))
        ),

        difference: new Set(
            [...a].filter(value => !b.has(value))
        ),
    };
}
07

Фільтр старших за 18.

#

Напишіть функцію, яка приймає об’єкт {ім’я: вік} і повертає об’єкт лише з тими, хто старший за 18.

function adultsOnly(data) {
    // ваш код тут
}
Рішення
function adultsOnly(data) {
    let result = {};
    for (const [name, age] of Object.entries(data)) {
        if (age > 18) {
            result[name] = age;
        }
    }
    return result;
}
08

Множина типів значень.

#

Напишіть функцію, яка приймає масив значень і повертає Set їхніх типів.

function valueTypes(values) {
    // ваш код тут
}
Рішення
function valueTypes(values) {
    let result = new Set();
    for (let v of values) {
        result.add(typeof v);
    }
    return result;
}
09

Найкращий учень за балами.

#

Напишіть функцію, яка приймає об’єкт із балами учнів і повертає ім’я учня з максимальним балом. Якщо об’єкт порожній — поверніть null.

function bestStudent(scores) {
    // ваш код тут
}
Рішення
function bestStudent(scores) {
    if (Object.keys(scores).length === 0) {
        return null;
    }

    let best = null;
    let maxScore = -1;

    for (const [name, score] of Object.entries(scores)) {
        if (score > maxScore) {
            maxScore = score;
            best = name;
        }
    }

    return best;
}
10

Підрахунок слів.

#

Напишіть функцію, яка приймає рядок і повертає об’єкт із кількістю кожного слова.

function wordFrequency(text) {
    // ваш код тут
}
Рішення
function wordFrequency(text) {
    const result = {};

    for (let word of text.trim().split(/\s+/)) {
        if (!word) continue;
        word = word.toLowerCase();
        if (word in result) {
            result[word] += 1;
        } else {
            result[word] = 1;
        }
    }

    return result;
}
11

Парні та непарні в об’єкті.

#

Напишіть функцію, яка приймає масив чисел і повертає об’єкт: - "even" — кількість парних - "odd" — кількість непарних

function evenOddStats(nums) {
    // ваш код тут
}
Рішення
function evenOddStats(nums) {
    let result = {"even": 0, "odd": 0};
    for (let n of nums) {
        if (n % 2 === 0) {
            result["even"] += 1;
        } else {
            result["odd"] += 1;
        }
    }
    return result;
}
12

Видалення значень null.

#

Напишіть функцію, яка приймає об’єкт і повертає новий об’єкт без пар, де значення дорівнює null.

function removeNulls(d) {
    // ваш код тут
}
Рішення
function removeNulls(d) {
    let result = {};
    for (const [k, v] of Object.entries(d)) {
        if (v !== null) {
            result[k] = v;
        }
    }
    return result;
}

// або так можна: створити новий об’єкт, не змінюючи початковий
let data = {a: 1, b: null, c: 3};
let result = {};

for (let key in data) {
    if (data[key] !== null) {
        result[key] = data[key];
    }
}

console.log(result);
13

Унікальні слова з рядків.

#

Напишіть функцію, яка приймає масив рядків і повертає Set усіх унікальних слів.

function uniqueWords(lines) {
    // ваш код тут
}
Рішення
function uniqueWords(lines) {
    const result = new Set();

    for (let line of lines) {
        for (let word of line.trim().split(/\s+/)) {
            if (word) {
                result.add(word.toLowerCase());
            }
        }
    }

    return result;
}
14

Цифри, літери та інші символи.

#

Напишіть функцію, яка приймає рядок і повертає об’єкт: - "digits" — кількість цифр - "letters" — кількість літер - "others" — кількість інших символів

function charStats(text) {
    // ваш код тут
}
Рішення
function charStats(text) {
    let result = {"digits": 0, "letters": 0, "others": 0};
    for (let ch of text) {
        if (/^\d$/.test(ch)) {
            result["digits"] += 1;
        } else if (/^\p{L}$/u.test(ch)) {
            result["letters"] += 1;
        } else {
            result["others"] += 1;
        }
    }
    return result;
}
15

Set слів за довжиною.

#

Напишіть функцію, яка приймає масив слів і повертає об’єкт, де: - ключ — довжина слова - значення — Set слів такої довжини

function groupByLength(words) {
    // ваш код тут
}
Рішення
function groupByLength(words) {
    let result = {};

    for (let w of words) {
        let l = w.length;

        if (!(l in result)) {
            result[l] = new Set();
        }

        result[l].add(w);
    }

    return result;
}