мое новое расписание: пн-пт с 8.00 по 16.00 по москве, сб и вс - выходные; после 16.00 и на вых. отвечаю по возможности

Удобное хранение данных в JavaScript

Пусть вам нужно реализовать какой-то скрипт и этот скрипт должен хранить и оперировать кое-какими данными.

Пусть ваш скрипт должен работать со списком юзеров: выводить весь список юзеров на экран, получать определенного юзера по каким-то критериям и так далее.

Вы знаете, что у каждого из ваших юзеров будет имя, фамилия и какой-то уникальный номер (назовем его id). При этом вам известно, что не может быть двух юзеров с одинаковым значением id.

Перед вами встает вопрос в каком же виде хранить данные юзеров.

Пусть вы решили сделать вот такой массив объектов:

let users = [ { id: 11, name: 'name11', surname: 'surname11', }, { id: 14, name: 'name14', surname: 'surname14', }, { id: 17, name: 'name17', surname: 'surname17', }, ];

Вопрос: удобно ли именно такое хранение данных? Ответ зависит от того, какие именно задачи будет решать ваш скрипт.

К примеру, перед вами будет стоять задача только вывода пользователей в цикле на экран. Давайте попробуем вывести:

for (let user of users) { document.write(user.id + ' ' + user.name + ' ' + user.surname + '<br>'); }

Как мы видим, вывести юзеров в цикле очень удобно. Делаем вывод, что такая структура хранения нам подходит.

Пусть теперь вам стало известно, что кроме вывода всех юзеров на экран, вам придется еще выводить одного юзера по его id.

Давайте, к примеру, выведем на экран юзера с id, равным 14. Для этого нам придется запустить цикл по всем пользователям и крутить его до тех пор, пока нам не встретится юзер с заданным id, вот так:

for (let user of users) { if (user.id == 14) { console.log(user); break; } }

В результате в консоль выведется следующий объект:

{ id: 14, name: 'name14', surname: 'surname14', }

Такой перебор циклом для поиска одного юзера уже кажется не очень удобным. Давайте поправим нашу структуру данных так, чтобы и задача поиска одного юзера также решалась удобно.

Для этого переделаем наш массив в объект и ключами этого объекта сделаем id юзеров, вот так:

let users = { 11: { name: 'name11', surname: 'surname11', }, 14: { name: 'name14', surname: 'surname14', }, 17: { name: 'name17', surname: 'surname17', }, };

Теперь получить юзера с id=14 будет очень легко:

console.log(users[14]);

Вывод списка юзеров чуть усложнится, но по-прежнему останется достаточно удобным:

for (let id in users) { let user = users[id]; document.write(id + ' ' + user.name + ' ' + user.surname + '<br>'); }

Даны данные в следующей структуре:

let data = [ { country: 'Россия', city: 'Москва', }, { country: 'Беларусь', city: 'Минск', }, { country: 'Россия', city: 'Питер', }, { country: 'Россия', city: 'Владивосток', }, { country: 'Украина', city: 'Львов', }, { country: 'Беларусь', city: 'Могилев', }, { country: 'Украина', city: 'Киев', }, ];

Вам известно, что вам нужно будет получать массивы городов определенных стран. К примеру, нужно будет получить все города России, либо все города Беларуси. Также необходимо будет находить количество городов в определенной стране.

Решите поставленные задачи для текущей структуры хранения данных.

После этого ответьте на вопрос, удобна ли такая структура данных для решения поставленных задач?

Переделайте структуру на более удобную. Напишите решения поставленных задач для новой структуры данных.

Даты

Пусть теперь вам необходимо хранить список дел за определенную дату.

Давайте выберем вот такую структуру и обсудим ее преимущества и недостатки:

let affairs = { '2018-11-29': ['массив дел'], '2018-11-30': ['массив дел'], '2018-12-30': ['массив дел'], '2018-12-31': ['массив дел'], '2019-12-29': ['массив дел'], '2019-12-30': ['массив дел'], '2019-12-31': ['массив дел'], }

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

Если вам не нужно получать данные по годам и месяцам, то наша структура достаточно удобная и компактная.

Допустим, что деление по годам и месяцам все-таки нужно. Тогда удобнее будет следующая структура:

let affairs = { 2018: { 11: { 29: ['массив дел'], 30: ['массив дел'], }, 12: { 30: ['массив дел'], 31: ['массив дел'], }, }, 2019: { 12: { 29: ['массив дел'], 30: ['массив дел'], 31: ['массив дел'], } }, }

Дан список каких-то данных за определенные даты, хранящийся в следующей структуре:

let data = [ { year: 2019, month: 11, day: 20, data: ['массив с данными'] }, { year: 2019, month: 11, day: 21, data: ['массив с данными'] }, { year: 2019, month: 12, day: 25, data: ['массив с данными'] }, { year: 2019, month: 12, day: 26, data: ['массив с данными'] }, { year: 2020, month: 10, day: 29, data: ['массив с данными'] }, { year: 2020, month: 10, day: 30, data: ['массив с данными'] }, { year: 2020, month: 11, day: 19, data: ['массив с данными'] }, { year: 2020, month: 11, day: 20, data: ['массив с данными'] }, ]

Пусть вам нужно будет получать данные за определенный день, за определенный месяц, и за определенный год. Удобна ли текущая структура хранения данных для этого?

Если да, оставьте все как есть, если нет, переделайте структуру на более удобную. Получите затем все данные за 2020 год.

Дана следующая структура для хранения событий и их дат:

let affairs = [ { date: '2019-12-29' event: 'name1' }, { date: '2019-12-31' event: 'name2' }, { date: '2019-12-29' event: 'name3' }, { date: '2019-12-30' event: 'name4' }, { date: '2019-12-29' event: 'name5' }, { date: '2019-12-31' event: 'name6' }, { date: '2019-12-29' event: 'name7' }, { date: '2019-12-30' event: 'name8' }, { date: '2019-12-30' event: 'name9' }, ]

Пусть вам нужно будет получать список событий за определенную дату. Удобна ли текущая структура хранения данных для этого?

Если да, оставьте все как есть, если нет, переделайте структуру на более удобную. Получите затем список событий за '2019-12-30'.

Задачи для закрепления

Пусть перед вами стоит задача хранения гороскопов для знаков зодиака. Гороскопы хранятся на несколько месяцев вперед.

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

Продумайте удобную структуру хранения данных. Укажите ее преимущества и недостатки. Поясните, для решения каких задач придуманная вами структура будет неудобна.

Пусть перед вами стоит задача хранения списка учеников какой-то школы. Нужно будет хранить имя, фамилию и отчество каждого ученика за все 11 классов школы.

Необходимо будет получать список учеников за определенный класс, например, всех учеников 10-го класса или всех учеников 11-го класса. Также необходимо будет получать учеников за определенную параллель, например, всех учеников 10А класса или всех учеников 10Б класса.

Продумайте удобную структуру хранения данных. Укажите ее преимущества и недостатки. Поясните, для решения каких задач придуманная вами структура будет неудобна.

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

Необходимо будет получать и выводить на экран список дел, помечая рядом с названием выполнено это дело или нет.

Продумайте удобную структуру хранения данных. Укажите ее преимущества и недостатки. Поясните, для решения каких задач придуманная вами структура будет неудобна.