Artem3677
@Artem3677
Учусь

Напишите код, которой переделает структуру данных вот в такую?

Дан список событий за определенные даты, хранящийся в следующей структуре:
let events = {
'2019-12-29': ['name1', 'name3', 'name5', 'name7'],
'2019-12-30': ['name4', 'name8', 'name9'],
'2019-12-31': ['name2', 'name6'],
}
Напишите код, которой переделает структуру данных вот в такую:
let events = [
{ 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' },
]
Я решил эту задачу так:
script.js
let events = {
'2019-12-29': ['name1', 'name3', 'name5', 'name7'],
'2019-12-30': ['name4', 'name8', 'name9'],
'2019-12-31': ['name2', 'name6'],
}

let arr = [];

let keys = Object.keys(events);
for (let i = 0; i < keys.length; i++) {
for (let j = 0; j < events[keys[i]].length; j++) {
let obj = {};
obj.date = keys[i];
obj.event = events[keys[i]][j];
arr.push(obj);
}
}
console.log(arr);
Всё работает.
Но я бы хотел узнать, можно ли решить то же самое при помощи функции: reduce? Если кто может, подскажите пожалуйста как это сделать. Если возможно, с детальным объяснением.
  • Вопрос задан
  • 2901 просмотр
Решения вопроса 2
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Если нужно просто методы массива и коротко, то можно так:
Object.entries(events).flatMap(([date, dateEvents]) => dateEvents.map(event => ({date, event})))
Ответ написан
Комментировать
alsolovyev
@alsolovyev
¯\_(ツ)_/¯ Enjoy life, Eat well & Laugh often
let events = {
    '2019-12-29': ['name1', 'name3', 'name5', 'name7'],
    '2019-12-30': ['name4', 'name8', 'name9'],
    '2019-12-31': ['name2', 'name6']
};

// Преобразуем объект в массив объектов с помощью метода reduce
// Object.keys(events) возвращает массив дат (ключей объекта events)
let result = Object.keys(events).reduce((acc, date) => {
    // acc (аккумулятор) — это значение, которое сохраняется между итерациями
    // date — это текущий элемент массива (в данном случае дата из объекта events)

    // На каждой итерации для текущей даты перебираем все события
    events[date].forEach(event => {
        // Добавляем объект { date, event } в аккумуляторный массив acc
        acc.push({ date, event });
    });
    // Возвращаем аккумулятор после обработки всех событий для текущей даты
    return acc;
}, []); // [] — начальное значение аккумулятора, с которого начинается накапливание данных

// Как работает reduce:
// 1. В начале acc равен [] (пустой массив).
// 2. На каждой итерации мы добавляем в acc новые объекты { date, event }.
// 3. Когда все даты и события обработаны, reduce возвращает конечный аккумулятор — массив объектов.

// Выводим результат в консоль
console.log(result);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы