Как написать функционал на JS, чтобы сгруппировать сотрудников по определенным датам?

Имеется следующий массив данных:

const arr = [
  { id: 111,   name: 'Azat',       salary:   11000,   date: '2020-12-01' },
  { id: 222,   name: 'Boris',      salary:  120000,   date: '2020-11-01' },
  { id: 333,   name: 'Valihan',    salary:  130000,   date: '2020-10-01' },
  { id: 444,   name: 'Grigoriy',   salary:  140000,   date: '2020-09-02' },
  { id: 555,   name: 'Diana',      salary:  150000,   date: '2020-09-01' },
  { id: 666,   name: 'Egor',       salary:  160000,   date: '2020-10-01' },
  { id: 777,   name: 'Jandos',     salary:  170000,   date: '2020-11-01' },
  { id: 888,   name: 'Zinaida',    salary: 1000000,   date: '2020-12-02' },
]

Задача: сгруппировать сотрудников по определенным датам:

obj = {
    '2020-12-01': {
        111: {
            "salary": 11000
        },
        888: {
            "salary": 1000000
        }
        // ... остальные люди
    }
    // ... остальные дни
}

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

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

var arr = [
  { id: 111,   name: 'Azat',       salary:   11000,   date: '2020-12-01' },
  { id: 222,   name: 'Boris',      salary:  120000,   date: '2020-11-01' },
  { id: 333,   name: 'Valihan',    salary:  130000,   date: '2020-10-01' },
  { id: 444,   name: 'Grigoriy',   salary:  140000,   date: '2020-09-02' },
  { id: 555,   name: 'Diana',      salary:  150000,   date: '2020-09-01' },
  { id: 666,   name: 'Egor',       salary:  160000,   date: '2020-10-01' },
  { id: 777,   name: 'Jandos',     salary:  170000,   date: '2020-11-01' },
  { id: 888,   name: 'Zinaida',    salary: 1000000,   date: '2020-12-02' },
]

console.log(arr.reduce(
  (r, x) => ((r[x.date] ||= Object.create(null))[x.id] = { salary: x.salary }, r),
  Object.create(null)
))
.as-console-wrapper.as-console-wrapper { max-height: 100vh }

→ Ссылка