Как группировать массив данных в JavaScript

Есть массив данных в JavaScript. Надо группировать их по свойству. Например, есть массив сотрудников:

employees = [
   {
    id: 111,
    name: 'Ivan',
    salary: 5000,
    date: '2020-01-01' 
   },
   {
    id: 222,
    name: 'Oleg',
    salary: 3000,
    date: '2020-01-01' 
   },
   {
    id: 111,
    name: 'Ivan',
    salary: 5000,
    date: '2020-01-01' 
   },
   {
    id: 333,
    name: 'Anya',
    salary: 3000,
    date: '2020-01-02' 
   },
   {
    id: 444,
    name: 'Arman',
    salary: 5000,
    date: '2020-01-01' 
   }
  ]

Теперь их надо группировать, типа:

obj = {
  '2020-01-01' : {
   111: {
      "salary": 5000
    
   },
  }
}

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

Автор решения: Андрей Солуянов

Если просто как получить подобную структуру. То можно так.Используя этот принцип можно в цикле перебрать все employees.Просто об этом в вопросе речь вроде не шла.

employees = [
    {
        id: 111,
        name: 'Ivan',
        salary: 5000,
        date: '2020-01-01'
    },
    {
        id: 222,
        name: 'Oleg',
        salary: 3000,
        date: '2020-01-01'
    },
    {
        id: 111,
        name: 'Ivan',
        salary: 5000,
        date: '2020-01-01'
    },
    {
        id: 333,
        name: 'Anya',
        salary: 3000,
        date: '2020-01-02'
    },
    {
        id: 444,
        name: 'Arman',
        salary: 5000,
        date: '2020-01-01'
    }
]

let date = employees[0].date;
let id = employees[0].id;
let salary = employees[0].salary;


obj = {
    [date] : {
        [id]: {
            "salary": salary
        },
    }
}

console.log(obj)
→ Ссылка
Автор решения: renich

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

let employees = [{
    id: 111,
    name: 'Ivan',
    salary: 5000,
    date: '2020-01-01'
  },
  {
    id: 222,
    name: 'Oleg',
    salary: 3000,
    date: '2020-01-01'
  },
  {
    id: 111,
    name: 'Ivan',
    salary: 5000,
    date: '2020-01-01'
  },
  {
    id: 333,
    name: 'Anya',
    salary: 3000,
    date: '2020-01-02'
  },
  {
    id: 444,
    name: 'Arman',
    salary: 5000,
    date: '2020-01-01'
  }
];
let groupResult = employees.reduce((obj, item) => {
  obj[item.date] = obj[item.date] || {};
  (obj[item.date][item.id] = obj[item.date][item.id] || []).push({
    id: item.id,
    name: item.name,
    date: item.date,
    salary: item.salary
  });
  return obj;
}, {});
console.log(groupResult);

→ Ссылка