JavaScript · Синтаксис · Начальный уровень

ООП, объекты, алгоритмическое мышление

15 задач

Упражнения по JavaScript на ООП, объекты и алгоритмическое мышление: классы для анализа данных, подсчёт слов и символов, работа с оценками, паролями, статистикой и преобразованием объектов.

Обычные объекты как состояние класса

#
Когда класс должен отслеживать переменное количество элементов — оценки многих студентов, очки игроков, слова в тексте — обычный объект {}, хранящийся в this, является правильным инструментом. ```javascript class GradeBook { constructor() { this.grades = {}; } add(name, grade) { if (!(name in this.grades)) { this.grades[name] = []; } this.grades[name].push(grade); } average(name) { const grades = this.grades[name] || []; if (grades.length === 0) return 0; return grades.reduce((sum, g) => sum + g, 0) / grades.length; } } ``` this.grades инициализируется как пустой объект в constructor. Проверка name in this.grades тестирует, существует ли уже ключ. || [] — безопасный запасной вариант, когда ключ может отсутствовать. Для подсчёта вхождений — частота слов, количество букв: ```javascript class WordCounter { constructor(text) { this.text = text; } count() { const result = {}; for (const word of this.text.split(" ")) { result[word] = (result[word] || 0) + 1; } return result; } } ``` result[word] || 0 возвращает текущий счётчик если ключ существует, или 0 если нет. Добавление 1 даёт новый счётчик. Это стандартная идиома подсчёта в JavaScript.

Паттерны реестра, счётчика и агрегатора

#
Реестр, предотвращающий дубликаты — используем Set для хранения зарегистрированных имён: ```javascript class UserRegistry { constructor() { this.users = new Set(); } register(username) { if (this.users.has(username)) { return false; } this.users.add(username); return true; } } ``` Set.has() — аналог Python's in для множеств. Set.add() добавляет элемент. Класс с балансом, соблюдающий правило: ```javascript class BankAccount { constructor() { this.balance = 0; } deposit(amount) { this.balance += amount; } withdraw(amount) { if (amount > this.balance) { return false; } this.balance -= amount; return true; } } ``` Поиск лучшего игрока — итерируем по записям объекта, отслеживаем ключ с максимальным значением: ```javascript class ScoreTable { constructor() { this.scores = {}; } add(name, points) { this.scores[name] = (this.scores[name] || 0) + points; } topPlayer() { let topName = null; let topScore = -Infinity; for (const [name, score] of Object.entries(this.scores)) { if (score > topScore) { topScore = score; topName = name; } } return topName; } } ``` Object.entries() возвращает пары [ключ, значение], которые можно деструктурировать прямо в заголовке for...of. -Infinity гарантирует, что любой реальный счёт будет больше начального значения.
01

WordCounter для текста.

#

Создайте класс WordCounter , который принимает строку текста. Добавьте метод count , который возвращает объект, где: - ключ — слово - значение — сколько раз оно встречается в тексте

class WordCounter {
    // ваш код здесь
}
Решение
class WordCounter {
    constructor(text) {
        this.text = text;
    }

    count() {
        let result = {};

        let words = this.text.trim()
            ? this.text.trim().split(/\s+/)
            : [];

        for (let w of words) {
            if (w in result) {
                result[w] += 1;
            } else {
                result[w] = 1;
            }
        }

        return result;
    }
}
02

Журнал оценок GradeBook.

#

Создайте класс GradeBook . Метод add(name, grade) добавляет оценку ученику. Метод average(name) возвращает среднюю оценку ученика.

class GradeBook {
    // ваш код здесь
}
Решение
class GradeBook {
    constructor() {
        this.data = {};
    }

    add(name, grade) {
        if (!(name in this.data)) {
            this.data[name] = [];
        }

        this.data[name].push(grade);
    }

    average(name) {
        let grades = this.data[name] ?? [];

        if (grades.length === 0) {
            return 0;
        }

        return grades.reduce((total, value) => total + value, 0) / grades.length;
    }
}
03

Подсчёт каждой буквы.

#

Напишите функцию, которая принимает строку и возвращает объект с количеством каждой буквы.

function letterStats(text) {
    // ваш код здесь
}
Решение
function letterStats(text) {
    let result = {};

    for (let ch of text) {
        if (/^\p{L}$/u.test(ch)) {
            ch = ch.toLowerCase();

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

    return result;
}
04

Проверка надёжности пароля.

#

Создайте класс PasswordChecker . Метод check возвращает true , если пароль: - длина ≥ 8 - есть хотя бы одна цифра

class PasswordChecker {
    // ваш код здесь
}
Решение
class PasswordChecker {
    check(password) {
        if (password.length < 8) {
            return false;
        }

        let hasDigit = false;

        for (let ch of password) {
            if (/^\d$/.test(ch)) {
                hasDigit = true;
                break;
            }
        }

        return hasDigit;
    }
}
05

Инвентарь товаров.

#

Создайте класс Inventory . Метод add_item(name, count) добавляет товар. Метод total_items() возвращает общее количество всех товаров.

class Inventory {
    // ваш код здесь
}
Решение
class Inventory {
    constructor() {
        this.items = {};
    }

    addItem(name, count) {
        if (name in this.items) {
            this.items[name] += count;
        } else {
            this.items[name] = count;
        }
    }

    totalItems() {
        let total = 0;

        for (let c of Object.values(this.items)) {
            total += c;
        }

        return total;
    }
}
06

Группировка слов по длине.

#

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

function lengthGroups(words) {
    // ваш код здесь
}
Решение
function lengthGroups(words) {
    let result = {};

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

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

    return result;
}
07

BankAccount без минуса.

#

Создайте класс BankAccount с методами: - deposit(amount) - withdraw(amount) — не даёт уйти в минус

class BankAccount {
    // ваш код здесь
}
Решение
class BankAccount {
    constructor(balance) {
        this.balance = balance;
    }
    deposit(amount) {
        this.balance += amount;
    }
    withdraw(amount) {
        if (amount <= this.balance) {
            this.balance -= amount;
            return true;
        }
        return false;
    }
}
08

Гласные и согласные.

#

Напишите функцию, которая принимает строку и возвращает объект с количеством гласных и согласных букв.

function vowelsAndConsonants(text) {
    // ваш код здесь
}
Решение
function vowelsAndConsonants(text) {
    let vowels = "aeiou";

    let result = {
        vowels: 0,
        consonants: 0
    };

    for (let ch of text.toLowerCase()) {
        if (/^\p{L}$/u.test(ch)) {

            if (vowels.includes(ch)) {
                result.vowels += 1;

            } else {
                result.consonants += 1;
            }
        }
    }

    return result;
}
09

Регистрация пользователей.

#

Создайте класс UserRegistry . Метод register(username) : - возвращает true , если пользователь добавлен - false , если такой уже есть

let users = [];

class UserRegistry {
    // ваш код здесь
}
Решение
let users = [];

class UserRegistry {
    register(username) {
        if (users.includes(username)) {
            return false;
        }

        users.push(username);

        return true;
    }
}
10

Классификация чисел.

#

Напишите функцию, которая принимает массив чисел и возвращает объект: - "positive" - "negative" - "zero"

function numberSummary(nums) {
    // ваш код здесь
}
Решение
function numberSummary(nums) {
    let result = {"positive": 0, "negative": 0, "zero": 0};
    for (let n of nums) {
        if (n > 0) {
            result["positive"] += 1;
        } else if (n < 0) {
            result["negative"] += 1;
        } else {
            result["zero"] += 1;
        }
    }
    return result;
}
11

Корзина покупок.

#

Создайте класс ShoppingCart . Метод add(product, price) добавляет товар. Метод total() возвращает сумму всех цен.

class ShoppingCart {
    // ваш код здесь
}
Решение
class ShoppingCart {
    constructor() {
        this.items = {};
    }
    add(product, price) {
        this.items[product] = price;
    }
    total() {
        let total = 0;
        for (let p of Object.values(this.items)) {
            total += p;
        }
        return total;
    }
}
12

Позиция первого появления символа.

#

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

function firstPositions(text) {
    // ваш код здесь
}
Решение
function firstPositions(text) {
    let result = {};

    for (let i = 0; i < text.length; i++) {
        if (!(text[i] in result)) {
            result[text[i]] = i;
        }
    }

    return result;
}
13

Таблица очков игроков.

#

Создайте класс ScoreTable . Метод add(name, ponumbers) добавляет очки игроку. Метод top_Player() возвращает имя игрока с максимальным счётом.

class ScoreTable {
    // ваш код здесь
}
Решение
class ScoreTable {
    constructor() {
        this.scores = {};
    }

    add(name, points) {
        if (name in this.scores) {
            this.scores[name] += points;
        } else {
            this.scores[name] = points;
        }
    }

    topPlayer() {
        let names = Object.keys(this.scores);

        if (names.length === 0) {
            return null;
        }

        let top = null;
        let maxScore = -1;

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

        return top;
    }
}
14

Обмен ключей и значений.

#

Напишите функцию, которая принимает объект и возвращает новый объект, где ключи и значения поменяны местами. Гарантируется, что значения уникальны.

function swapDict(d) {
    // ваш код здесь
}
Решение
function swapDict(d) {
    let result = {};
    for (const [k, v] of Object.entries(d)) {
        result[v] = k;
    }
    return result;
}
15

Анализатор текста.

#

Создайте класс TextAnalyzer . Метод analyze возвращает объект: - "chars" — количество символов - "words" — количество слов - "lines" — количество строк

class TextAnalyzer {
    // ваш код здесь
}
Решение
class TextAnalyzer {
    constructor(text) {
        this.text = text;
    }

    analyze() {
        const chars = this.text.length;
        const words = this.text.trim() ? this.text.trim().split(/\s+/).length : 0;
        const lines = this.text ? this.text.split("\n").length : 0;

        return {
            chars,
            words,
            lines,
        };
    }
}