Трасформировать многомерный массив с объектами в многомерный объект с объектами, внутри которых распологаются массивы

Мне необходимо получить обЪект следующего вида

{
    2019: {
        11: [массив событий],
        12: [массив событий],
    }
    2020: {
        10: [массив событий],
        11: [массив событий],
        12: [массив событий],
    }
}

Я реализую следующий код (как водится, неправильный):

   let events = [
    {
        date:  '2019-12',
        event: 'name1'
    },
    {
        date:  '2019-12',
        event: 'name2'
    },
    {
        date:  '2019-11',
        event: 'name3'
    },
    {
        date:  '2019-11',
        event: 'name4'
    },
    {
        date:  '2020-10',
        event: 'name5'
    },
    {
        date:  '2020-10',
        event: 'name6'
    },
    {
        date:  '2020-11',
        event: 'name5'
    },
    {
        date:  '2020-11',
        event: 'name6'
    },
    {
        date:  '2020-12',
        event: 'name7'
    },
    {
        date:  '2020-12',
        event: 'name8'
    },
    {
        date:  '2020-12',
        event: 'name9'
    },
]

let result = {};
for (const obj of events) {
        if (!result[obj.date.slice(0,4)]) {
          result[obj.date.slice(0,4)] = [];
        }
        result[obj.date.slice(0,4)].push(obj.event);
    }
    console.log(result)

ALERT Мне не особо нужно готовое решение. Мне больше нужны указания на ошибки моём алгоритме создания многомерного объекта. У меня с ними проблемы. Практически на всех учебных сайтах даются простые примеры, логику формирования которых я понимаю, но как дело доходит до создания чего-то своего - я теряюсь( Мне интересен сам алгоритм создания по ступеням) Не минусите плиз. А то я так никогда с объектами (да и с многомерными массивами) не разбирусь). Заранее благодарю.


Ответы (1 шт):

Автор решения: ksa

Мне необходимо получить обЪект следующего вида

Предложу такой вариант решения задачки...

const events = [
  {
      date:  '2019-12',
      event: 'name1'
  },
  {
      date:  '2019-12',
      event: 'name2'
  },
  {
      date:  '2019-11',
      event: 'name3'
  },
  {
      date:  '2019-11',
      event: 'name4'
  },
  {
      date:  '2020-10',
      event: 'name5'
  },
  {
      date:  '2020-10',
      event: 'name6'
  },
  {
      date:  '2020-11',
      event: 'name5'
  },
  {
      date:  '2020-11',
      event: 'name6'
  },
  {
      date:  '2020-12',
      event: 'name7'
  },
  {
      date:  '2020-12',
      event: 'name8'
  },
  {
      date:  '2020-12',
      event: 'name9'
  },
]

const result = events.reduce((obj, o) => {
  const [y, m] = o.date.split('-')
  obj[y] ??= {}
  obj[y][m] ??= []
  obj[y][m].push(o.event)
  return obj
}, {})
console.log(result)

→ Ссылка