Объединение объектов javascript

Имеется массив объектов:

let arr = [
{
 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' 
}]

Нужно группировать по определенным датам. Не получается передать остальные значения кроме id и salary

let res = {};

arr.forEach(function(object){
    res[object.id] = (res[object.id] || 0) + object.salary;
});

let result = Object.keys(res).map(function(key){
    return { id : key, name: key, salary : res[key] }
});

console.dir(result);

В чем проблема? Как можно объединить не используя reduce


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

Автор решения: Anton Shchyrov

При помощи стандартного метода Array.reduce()

let arr = [{
    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'
  }
];

const res = arr.reduce(function(res, cur) {
  if (!res[cur.date]) {
    res[cur.date] = {};
  }
  if (!res[cur.date][cur.id]) {
    res[cur.date][cur.id] = {
      name: cur.name,
      salary: cur.salary
    };
  } else {
    res[cur.date][cur.id].salary += cur.salary;
  }
  return res;
}, {});

console.log(res);

Или без reduce

let arr = [{
    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'
  }
];

const res = {};
arr.forEach(function(cur) {
  if (!res[cur.date]) {
    res[cur.date] = {};
  }
  if (!res[cur.date][cur.id]) {
    res[cur.date][cur.id] = {
      name: cur.name,
      salary: cur.salary
    };
  } else {
    res[cur.date][cur.id].salary += cur.salary;
  }
});

console.log(res);

→ Ссылка