@dGololobov
начинающий

Как уникализировать массив объектов по значениям одного из их свойств, попутно просуммировав значения другого свойства?

Есть массив объектов с дублирующимися id:

[ 
  { id: '235540633', duration: 163 },
  { id: '222333444', duration: 100 },
  { id: '112233445', duration: 31 },
  { id: '112233445', duration: 63 } 
]

Из него нужно получить массив без дублирующихся id, но при этом свойство duration должно суммироваться, т.е.:

[ 
  { id: '235540633', duration: 163 },
  { id: '222333444', duration: 100 },
  { id: '112233445', duration: 94 }
]
  • Вопрос задан
  • 1410 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
function uniqueWithSum(arr, idKey, sumKey) {
  const unique = {};

  for (const n of arr) {
    const id = n[idKey];

    if (!unique.hasOwnProperty(id)) {
      unique[id] = { ...n, [sumKey]: 0 };
    }

    unique[id][sumKey] += n[sumKey];
  }

  return Object.values(unique);
}


const result = uniqueWithSum(arr, 'id', 'duration');

UPD. Сократим и осовременим код; кроме того, обеспечим корректную обработку массивов, элементами которых также являются массивы - вместо объектов будем создавать экземпляры того же класса, что и элементы исходного массива:

const uniqueWithSum = (arr, idKey, sumKey) =>
  Object.values(arr.reduce((acc, n) => (
    acc[n[idKey]] ??= Object.assign(new n.constructor, n, { [sumKey]: 0 }),
    acc[n[idKey]][sumKey] += n[sumKey],
    acc
  ), {}));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
17 апр. 2024, в 00:48
35000 руб./за проект
17 апр. 2024, в 00:13
800 руб./за проект
17 апр. 2024, в 00:06
240000 руб./за проект