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

103
11 апреля 2022, 06:30

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

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

Answer 1

При помощи стандартного метода 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);

READ ALSO
discord.js mysql cooldown

discord.js mysql cooldown

Как сделать кулл даун? пример: Пользователь пишет daily данные записываются в дб и создается кулдаун например на 12 часовесли он пишет команду...

149
Поиск верхнего родителя

Поиск верхнего родителя

Есть массив ОбъектовВ объекте данные об имени, id и если есть родительский элемент, то еще и родительский элемент

299
Ajax метод POST не отправляет на сервер данные

Ajax метод POST не отправляет на сервер данные

Дело в том, что ajax не отправляет данные на серверПодскажите пожалуйста из-за чего такое может быть

171
Равновеликие массивы

Равновеликие массивы

Назавём две массивы равновеликими , если только один раз в одном из массивов, сменив места одной пары из элементов , мы получим другой массивНапример...

212