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;
}