Практическая работа №6
Основные теоретические положения
Section titled “Основные теоретические положения”1. Создание объекта
Объект хранит связанные данные в виде свойств.
const product = { id: 1, name: "Клавиатура", price: 3500, quantity: 7,};Получить значение свойства можно через точку:
console.log(product.name);console.log(product.price);или через квадратные скобки:
console.log(product["name"]);2. Изменение и добавление свойств
Существующее свойство можно изменить:
product.quantity = 5;Новое свойство можно добавить:
product.category = "Периферия";Удалить свойство:
delete product.category;3. Вложенные объекты
Свойством объекта может быть другой объект.
const server = { name: "web-01", online: true,
metrics: { cpu: 42, memory: 68, },};Обращение к вложенному свойству:
console.log(server.metrics.cpu);Изменение:
server.metrics.cpu = 75;4. Массив объектов
Несколько однотипных объектов удобно хранить в массиве.
const products = [ { id: 1, name: "Клавиатура", price: 3500, quantity: 7, }, { id: 2, name: "Мышь", price: 1800, quantity: 3, },];Перебор:
for (const product of products) { console.log(product.name);}5. Поиск объекта в массиве
Поиск можно реализовать уже известным циклом.
function findProductById(products, id) { for (const product of products) { if (product.id === id) { return product; } }
return null;}Использование:
const product = findProductById(products, 2);
if (product === null) { console.log("Товар не найден");} else { console.log(product.name);}6. Добавление нового объекта в массив
Новый объект можно создать из пользовательских данных:
const name = prompt("Название товара:");const price = Number(prompt("Цена товара:"));const quantity = Number(prompt("Количество:"));
const product = { id: 3, name: name, price: price, quantity: quantity,};
products.push(product);В сокращённой форме:
const product = { id, name, price, quantity,};если переменные имеют такие же имена, как свойства.
7. Изменение состояния объекта
После поиска объекта можно изменить его свойства.
function changeQuantity(products, id, amount) { const product = findProductById(products, id);
if (product === null) { return false; }
if (product.quantity + amount < 0) { return false; }
product.quantity += amount;
return true;}Такой подход позволяет отделить правила изменения данных от пользовательского интерфейса.
8. Обработка массива объектов
Например, рассчитаем общую стоимость складских остатков:
function calculateInventoryValue(products) { let total = 0;
for (const product of products) { total += product.price * product.quantity; }
return total;}Можно также выполнять выборку по условию:
function showLowStock(products, limit) { for (const product of products) { if (product.quantity <= limit) { console.log(product.name); } }}9. Интерактивное меню
Для небольшой программы можно организовать меню:
while (true) { const action = prompt(`1 — показать данные2 — найти запись3 — добавить запись4 — изменить запись0 — выход`);
if (action === null || action === "0") { break; }
if (action === "1") { // ... } else if (action === "2") { // ... } else { alert("Неизвестная команда"); }}10. Разделение данных, логики и взаимодействия с пользователем
Для этой работы используйте структуру:
Исходные данные↓Функции поиска↓Функции изменения↓Функции расчётов и статистики↓Интерактивное менюЭто подготовит программу к дальнейшему переходу к объектно-ориентированной и модульной организации кода.
Задания для выполнения
Section titled “Задания для выполнения”Часть 1. Исследование объектов и массивов объектов
Выполните задания 1–3 полностью. Они используются как общая подготовка перед комплексным индивидуальным вариантом.
Задание 1.1. Работа с объектом
Создайте объект:
const user = { id: 1, name: "Алексей", age: 20, active: true,
contacts: { email: "alex@example.com", phone: "+79990000000", },};Выполните:
- выведите имя пользователя;
- выведите email;
- измените возраст на
21; - измените телефон;
- добавьте свойство
roleсо значением"user"; - выведите получившийся объект через
console.log().
Ответьте:
- чем
user.nameотличается отuser["name"]; - как обратиться к
user.contacts.email; - что произойдёт при обращении к несуществующему свойству.
Задание 1.2. Массив объектов
Создайте:
const products = [ { id: 1, name: "Клавиатура", price: 3500, quantity: 7 }, { id: 2, name: "Мышь", price: 1800, quantity: 3 }, { id: 3, name: "SSD 1 TB", price: 7200, quantity: 0 }, { id: 4, name: "Монитор", price: 18500, quantity: 2 },];С помощью цикла:
- выведите название и стоимость каждого товара;
- определите количество товаров с нулевым остатком;
- определите количество товаров дороже
5000₽; - рассчитайте общую стоимость всех товаров на складе с учётом количества.
Задание 1.3. Поиск и изменение объекта
Реализуйте:
findProductById(products, id)Затем через prompt() запросите идентификатор товара.
Если товар найден:
Товар: МышьЦена: 1800 руб.Остаток: 3Если нет:
Товар не найденПосле этого запросите новое количество и измените свойство quantity.
Не допускайте отрицательный остаток.
Часть 2. Комплексное индивидуальное задание
Section titled “Часть 2. Комплексное индивидуальное задание”Вариант 1. Система складского инвентаря
Исходные данные:
const inventory = [ { id: 1, name: "Клавиатура", category: "Периферия", price: 3500, quantity: 7, }, { id: 2, name: "Мышь", category: "Периферия", price: 1800, quantity: 3, }, { id: 3, name: "SSD 1 TB", category: "Комплектующие", price: 7200, quantity: 0, },];Реализуйте функции:
showInventory()findProductById()addProduct()changeQuantity()showLowStock()calculateInventoryValue()Программа должна позволять:
- просмотреть все товары;
- найти товар по
id; - добавить новый товар;
- выполнить поступление или списание товара;
- показать товары с остатком не более
3; - вывести общую стоимость складских остатков.
Списание, приводящее к отрицательному остатку, запрещено.
Вариант 2. RPG-персонаж и монстры
Исходный персонаж:
const player = { name: "Arin", level: 1, experience: 0, health: 100,
stats: { attack: 12, defense: 8, },
inventory: [ "Малое зелье", "Железный меч", ],};Монстры:
const monsters = [ { id: 1, name: "Слизень", level: 1, experience: 30, defeated: false, }, { id: 2, name: "Гоблин", level: 2, experience: 55, defeated: false, }, { id: 3, name: "Орк", level: 3, experience: 90, defeated: false, },];Реализуйте:
showPlayer()showMonsters()findMonsterById()defeatMonster()addItem()checkLevelUp()Правила:
- уже побеждённого монстра нельзя победить повторно;
- персонаж может победить монстра, если его уровень не ниже уровня монстра;
- после победы начисляется опыт;
- каждые
100опыта повышают уровень; - при повышении уровня увеличьте
attackиdefenseна2; - пользователь может добавить найденный предмет в
inventory.
Меню должно позволять посмотреть персонажа, список монстров, выбрать монстра для боя и добавить предмет.
Вариант 3. Система заказов интернет-магазина
const orders = [ { id: 101, customer: { name: "Иван", phone: "+79990000001", }, total: 7200, status: "new", }, { id: 102, customer: { name: "Анна", phone: "+79990000002", }, total: 3100, status: "processing", },];Реализуйте:
showOrders()findOrderById()addOrder()changeOrderStatus()calculateRevenue()showOrdersByStatus()Допустимые статусы:
newprocessingshippeddeliveredcancelledНе разрешайте устанавливать неизвестный статус.
Дополнительно:
- посчитайте сумму заказов без статуса
cancelled; - покажите заказы с выбранным пользователем статусом;
- при добавлении заказа запросите имя клиента, телефон и сумму.
Вариант 4. Служба технической поддержки
const tickets = [ { id: 201, title: "Не работает интернет", priority: "high", status: "new",
user: { name: "Иван", department: "Бухгалтерия", }, }, { id: 202, title: "Ошибка приложения", priority: "medium", status: "in_progress",
user: { name: "Анна", department: "Отдел продаж", }, },];Реализуйте:
showTickets()findTicketById()createTicket()changeStatus()showTicketsByStatus()calculateStatistics()Допустимые статусы:
newin_progresswaitingresolvedСтатистика должна содержать количество заявок каждого статуса и количество заявок с приоритетом high.
Вариант 5. Электронный журнал
const students = [ { id: 1, name: "Иван Петров", group: "5981", grades: [5, 4, 4, 3], }, { id: 2, name: "Анна Смирнова", group: "5981", grades: [5, 5, 4, 5], },];Реализуйте:
showStudents()findStudentById()addStudent()addGrade()calculateAverageGrade()showStudentStatistics()Программа должна:
- находить студента;
- добавлять нового студента;
- добавлять оценку от
2до5; - рассчитывать средний балл;
- показывать студента с наибольшим средним баллом;
- выводить количество студентов со средним баллом не ниже
4.
Вариант 6. Библиотечная система
const books = [ { id: 1, title: "Чистый код", author: "Роберт Мартин", available: true,
borrower: { name: null, }, }, { id: 2, title: "JavaScript. Подробное руководство", author: "Дэвид Флэнаган", available: false,
borrower: { name: "Иван", }, },];Реализуйте:
showBooks()findBookById()addBook()borrowBook()returnBook()showAvailableBooks()Правила:
- нельзя выдать уже выданную книгу;
- нельзя вернуть книгу, которая уже находится в библиотеке;
- при выдаче сохраняйте имя читателя;
- при возврате очищайте данные читателя.
Вариант 7. Мониторинг серверов
const servers = [ { id: 1, name: "web-01", online: true,
metrics: { cpu: 42, memory: 68, }, }, { id: 2, name: "db-01", online: true,
metrics: { cpu: 91, memory: 87, }, },];Реализуйте:
showServers()findServerById()addServer()updateMetrics()getServerState()showCriticalServers()Состояние сервера:
offline— сервер выключен;normal— CPU и память ниже80%;warning— хотя бы один показатель от80%;critical— хотя бы один показатель от95%.
Не допускайте показатели меньше 0 или больше 100.
Вариант 8. Система бронирования гостиницы
const rooms = [ { id: 101, category: "standard", pricePerNight: 3500, occupied: false,
guest: { name: null, nights: 0, }, }, { id: 102, category: "comfort", pricePerNight: 5000, occupied: true,
guest: { name: "Анна", nights: 3, }, },];Реализуйте:
showRooms()findRoomById()addRoom()bookRoom()checkoutRoom()calculateBookingPrice()Правила:
- занятый номер нельзя забронировать;
- при бронировании сохраняются имя гостя и число ночей;
- при выселении данные гостя очищаются;
- стоимость проживания равна
pricePerNight × nights; - покажите все свободные номера.
Вариант 9. Трекер задач
const tasks = [ { id: 1, title: "Исправить форму авторизации", status: "todo", priority: "high",
assignee: { name: "Иван", }, }, { id: 2, title: "Обновить документацию", status: "in_progress", priority: "medium",
assignee: { name: "Анна", }, },];Реализуйте:
showTasks()findTaskById()addTask()changeTaskStatus()assignTask()showTaskStatistics()Допустимые статусы:
todoin_progressdoneСтатистика должна содержать:
- количество задач каждого статуса;
- количество задач высокого приоритета;
- процент завершённых задач.
Вариант 10. Система проката автомобилей
const cars = [ { id: 1, brand: "Toyota", model: "Corolla", pricePerDay: 3500, available: true,
rental: { customer: null, days: 0, }, }, { id: 2, brand: "Kia", model: "Rio", pricePerDay: 2800, available: false,
rental: { customer: "Иван", days: 4, }, },];Реализуйте:
showCars()findCarById()addCar()rentCar()returnCar()calculateRentalPrice()Правила:
- нельзя выдать уже арендованный автомобиль;
- при аренде сохраняются клиент и количество дней;
- стоимость равна
pricePerDay × days; - при возврате данные аренды очищаются;
- покажите список доступных автомобилей;
- рассчитайте стоимость текущих аренд.
Требования к результату
Section titled “Требования к результату”Индивидуальная программа должна:
- запускаться без синтаксических ошибок;
- иметь исходный набор данных;
- использовать объекты и массив объектов;
- содержать вложенную структуру данных;
- состоять минимум из пяти функций;
- позволять выполнить основные операции через интерактивное меню;
- выполнять поиск, добавление и изменение данных;
- содержать хотя бы один расчёт или статистический показатель;
- проверять пользовательский ввод;
- корректно обрабатывать ситуацию, когда объект не найден;
- не допускать заведомо некорректное изменение состояния данных.
Контрольные вопросы
Section titled “Контрольные вопросы”- Что называется объектом в JavaScript?
- Как создать объект?
- Какими способами можно получить значение свойства?
- Как добавить новое свойство?
- Как изменить существующее свойство?
- Как удалить свойство?
- Что представляет собой вложенный объект?
- Как обратиться к свойству вложенного объекта?
- Что представляет собой массив объектов?
- Как перебрать массив объектов?
- Как найти объект по идентификатору без использования
find()? - Что следует вернуть из функции, если объект не найден?
- Что происходит, если изменить свойство объекта, найденного внутри массива?
- Для чего используются функции поиска?
- Почему не стоит размещать всю программу внутри одного обработчика меню?
- Чем данные приложения отличаются от функций, которые их обрабатывают?
- Для чего нужна проверка пользовательского ввода?
- Почему при изменении состояния объекта необходимо проверять допустимость операции?
- Чем массив обычных значений отличается от массива объектов?
- Каким образом эта работа подготавливает программу к дальнейшему использованию классов?
При защите будьте готовы найти указанный преподавателем объект, изменить правило одной операции или добавить новое поле в используемую структуру данных.