Словари и хеш-таблицы в 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]]} руб.`);
}
Частые ошибки новичков
- Забываем ставить запятые между парами
// Неправильно const obj = {a: 1 b: 2} // Ошибка! // Правильно const obj = {a: 1, b: 2} - Путаем ключи с переменными
// Неправильно const key = "имя"; const obj = {key: "Анна"}; // Создаст ключ "key", а не "имя" // Правильно const key = "имя"; const obj = {[key]: "Анна"}; // Создаст ключ "имя" - Пытаемся обратиться к несуществующему ключу
const obj = {a: 1}; console.log(obj.b); // undefined (не ошибка, но может удивить) - Используем точку для ключей с пробелами
// Неправильно 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();
});
Теперь ты знаешь, как работают словари! Они помогают хранить данные парами "ключ-значение" и быстро их находить. Это как твой личный помощник, который помнит всё по своим полочкам.