Задать вопрос
@adizh

Как можно преобразовать массив из объектов с помощью функции reduce?

Есть массив из объектов, например:
let data=[
  {brand:'iowa', price:12},
  {brand:'iowa', price:42},
  {brand:'zero', price:58},
  {brand:'zero', price:32}]

Нужно преобразовать так:
let data=[
  {brand:'iowa', price:54},
  {brand:'zero', price:90}]

То есть, цены должны складываться в соответствии с названиями брендов. Как это можно сделать через фунциюю reduce или через любой другой способ?
  • Вопрос задан
  • 198 просмотров
Подписаться 1 Простой Комментировать
Решение пользователя 0xD34F К ответам на вопрос (2)
0xD34F
@0xD34F Куратор тега JavaScript
Делаем ровно то, что спрошено:

const result = Object.values(data.reduce((acc, n) => (
  (acc[n.brand] ??= { ...n, price: 0 }).price += n.price,
  acc
), {}));

Или, решаем задачу в более общем виде:

function uniqueWithSum(data, key, sumKey) {
  const getKey = key instanceof Function ? key : n => n[key];
  const unique = new Map;

  for (const n of data) {
    const k = getKey(n);
    unique
      .set(k, unique.get(k) ?? Object.assign(new n.constructor, n, { [sumKey]: 0 }))
      .get(k)[sumKey] += n[sumKey];
  }

  return unique;
}

// ваш случай
const result = [...uniqueWithSum(data, 'brand', 'price').values()];

// элементам исходного массива не обязательно быть объектами
Array.from(uniqueWithSum([
  [ 'aaa',   1 ],
  [ 'aaa',  10 ],
  [ 'aaa', 100 ],
  [ 'bbb', 666 ],
], 0, 1).values()) // [ [ 'aaa', 111 ], [ 'bbb', 666 ] ]
Ответ написан