⚡ JavaScript

Словари и хеш-таблицы в JavaScript (Node.js): подробное руководство

Словари и хеш-таблицы в JavaScript

Введение: что это и зачем?

Представь, что у тебя есть рюкзак, в котором лежат вещи, но у каждой вещи есть своя именная бирка. Например, бирка "любимая игрушка" указывает на мяч, а бирка "вкусняшка" — на шоколадку. Чтобы быстро найти шоколадку, ты не роешься во всем рюкзаке, а просто смотришь на бирку "вкусняшка".

Словарь (или объект) в JavaScript работает точно так же! Это специальная структура данных, где у каждого значения (шоколадка) есть свой ключ (бирка "вкусняшка").

Словари помогают:

  • Быстро находить информацию по имени (ключу)
  • Хранить связанные данные вместе (например, имя человека и его номер телефона)
  • Легко добавлять, изменять и удалять записи

Основной синтаксис с примерами

Словарь создается с помощью фигурных скобок {}. Внутри мы пишем пары "ключ: значение", разделяя их запятыми.

// Создаем словарь с приветствиями
const greetings = {
  "Россия": "Привет!",
  "Франция": "Bonjour!",
  "Италия": "Ciao!"
};

// Выводим приветствие для России
console.log(greetings["Россия"]); // Привет!

С ключами можно работать как с переменными. Давай посмотрим на основные действия:

// Создаем пустой телефонный справочник
const phoneBook = {};

// Добавляем записи
phoneBook["Анна"] = "8-999-123-45-67";
phoneBook["Борис"] = "8-999-765-43-21";

// Получаем значение по ключу
console.log(phoneBook["Анна"]); // 8-999-123-45-67

// Изменяем существующую запись
phoneBook["Анна"] = "8-999-000-00-00";

// Удаляем запись
delete phoneBook["Борис"];

console.log(phoneBook); // { Анна: '8-999-000-00-00' }

Еще один удобный способ — использовать точечную нотацию, если ключ состоит из одного слова без пробелов:

const book = {};
book.title = "Война и мир";
book.author = "Лев Толстой";
console.log(book.author); // Лев Толстой

Разбор типичных задач

Задача 1: Приветствие для путешественника

Нужно создать словарь, где ключ — страна, значение — приветствие. Пользователь вводит страну, программа выводит приветствие.

const readline = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});

const dictionary = {
  "Россия": "Здравствуйте!",
  "Франция": "Bonjour!",
  "Италия": "Ciao!",
  "Испания": "¡Hola!"
};

readline.question('Введите страну: ', (country) => {
  if (dictionary[country]) {
    console.log(`Приветствие: ${dictionary[country]}`);
  } else {
    console.log('Страна не найдена в словаре');
  }
  readline.close();
});

Задача 2: Телефонный справочник

У нас есть справочник с именами и номерами. Нужно найти номер по имени.

const readline = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});

const phoneBook = {
  "Иван": "8-111-222-33-44",
  "Мария": "8-555-666-77-88",
  "Петр": "8-999-888-77-66"
};

readline.question('Введите имя: ', (name) => {
  if (phoneBook[name]) {
    console.log(`Телефон ${name}: ${phoneBook[name]}`);
  } else {
    console.log('Абонент не найден');
  }
  readline.close();
});

Задача 3: Книжная карточка (план на неделю)

Создаем словарь, где ключи — дни недели, а значения — списки дел.

const readline = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});

const weekPlan = {};
const days = ["понедельник", "вторник", "среда"];

function addTask() {
  if (days.length === 0) {
    console.log("Готовый план:");
    console.log(weekPlan);
    readline.close();
    return;
  }
  
  const day = days.shift();
  readline.question(`Что делаем в ${day}? `, (task) => {
    weekPlan[day] = task;
    addTask();
  });
}

addTask();

Задача 4: Цифровой блокнот (удаление контакта)

Удаляем контакт из словаря с помощью оператора delete.

const readline = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});

const contacts = {
  "Анна": "8-111-111-11-11",
  "Борис": "8-222-222-22-22",
  "Вика": "8-333-333-33-33"
};

console.log("Текущие контакты:", Object.keys(contacts));

readline.question('Кого удалить? ', (name) => {
  if (contacts[name]) {
    delete contacts[name];
    console.log(`${name} удален(а). Остались:`, Object.keys(contacts));
  } else {
    console.log("Такого контакта нет");
  }
  readline.close();
});

Задача 5: Ключи словаря (список товаров)

Выводим все названия товаров из словаря с помощью Object.keys().

const products = {
  "Хлеб": 50,
  "Молоко": 80,
  "Яблоки": 120,
  "Сыр": 200
};

console.log("Список товаров:");
const names = Object.keys(products);
for (let i = 0; i < names.length; i++) {
  console.log(`${i + 1}. ${names[i]} — ${products[names[i]]} руб.`);
}

Частые ошибки новичков

  1. Забываем ставить запятые между парами
    // Неправильно
    const obj = {a: 1 b: 2} // Ошибка!
    
    // Правильно
    const obj = {a: 1, b: 2}
  2. Путаем ключи с переменными
    // Неправильно
    const key = "имя";
    const obj = {key: "Анна"}; // Создаст ключ "key", а не "имя"
    
    // Правильно
    const key = "имя";
    const obj = {[key]: "Анна"}; // Создаст ключ "имя"
  3. Пытаемся обратиться к несуществующему ключу
    const obj = {a: 1};
    console.log(obj.b); // undefined (не ошибка, но может удивить)
  4. Используем точку для ключей с пробелами
    // Неправильно
    const obj = {};
    obj.my key = 5; // Ошибка!
    
    // Правильно
    obj["my key"] = 5;

Итоговый пример: "Библиотека книг"

Создадим программу, которая хранит информацию о книгах. Каждая книга — это словарь с ключами: название, автор, год. А все книги хранятся в другом словаре, где ключ — ID книги.

const readline = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout
});

// Словарь всех книг
const library = {};

function addBook(id, title, author, year) {
  library[id] = {
    title: title,
    author: author,
    year: year
  };
  console.log(`Книга "${title}" добавлена!`);
}

function findBook(id) {
  if (library[id]) {
    const book = library[id];
    console.log(`Найдено: "${book.title}", автор: ${book.author}, ${book.year} г.`);
  } else {
    console.log("Книга не найдена");
  }
}

function deleteBook(id) {
  if (library[id]) {
    delete library[id];
    console.log("Книга удалена");
  } else {
    console.log("Такой книги нет");
  }
}

// Добавляем несколько книг
addBook("001", "Маленький принц", "Антуан де Сент-Экзюпери", 1943);
addBook("002", "Гарри Поттер", "Джоан Роулинг", 1997);

console.log("\nВсе ID книг:", Object.keys(library));

readline.question('Введите ID для поиска: ', (id) => {
  findBook(id);
  readline.close();
});

Теперь ты знаешь, как работают словари! Они помогают хранить данные парами "ключ-значение" и быстро их находить. Это как твой личный помощник, который помнит всё по своим полочкам.