@Crone1331

Как сформировать новый массив объектов, сделав слияние по некоторому параметру?

Есть массив:

const arr = [ 
  {merch: 111, games: ['loto1', 'loto2']}, 
  {merch: 111, games: ['loto2', 'loto3']}, 
  {merch: 222, games: ['loto3', 'loto4']},
];

Массив состоит из объектов, у них могут быть схожие значения в поле merch и общие значения в games как сформировать новый массив, объединив в нем объекты по полю merch? При этом без дубликатов, на выходе хочу иметь подобное:

[
  {merch: 111, games: ['loto1', 'loto2', 'loto3']},
  {merch: 222, games: ['loto3', 'loto4']},
]

Пытался сделать через reduce из библиотеки lodash, но не до конца понимаю как это сделать.
  • Вопрос задан
  • 174 просмотра
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Пытался сделать через reduce из библиотеки lodash

Давайте так - или lodash, или reduce, но не оба сразу:

const newArr = _.map(_.groupBy(arr, 'merch'), (v, k) => ({
  merch: +k,
  games: _.uniq(_.flatMap(v, 'games')),
}));

const newArr = Object
  .entries(arr.reduce((acc, n) => ((acc[n.merch] ??= []).push(...n.games), acc), {}))
  .map(n => ({ merch: +n[0], games: [...new Set(n[1])] }));
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
Object.values(
  arr.reduce((acc, c) => {
    const { merch, games } = c;
    if (!acc[merch]) acc[merch] = c;
    else {
      const merged = [...acc[c.merch].games, ...games];
      acc[c.merch].games = [...new Set(merged)];
    }
    return acc;
  }, {})
);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы