Мне нужно пересобрать массив и сложить все одинаковые элементы

У меня есть массив внутри объекты. В каждом объекте есть поле name and qty. Мне нужно пересобрать, чтобы если у элементов одинаковые name их qty складывается. Прикреплялю ссылку на sandbox.

Изначальный массив:

const products = [
  {
    name: "Album DVD",
    qty: 1
  },
  {
    name: "Album CD",
    qty: 5
  },
  {
    name: "PhotoBook",
    qty: 2
  },
  {
    name: "Album DVD",
    qty: 3
  },
  {
    name: "Album CD",
    qty: 2
  },
  {
    name: "PhotoCard",
    qty: 1
  }
]

Пример массива, который хочу получить:

const products = [
  {
    name: "Album DVD",
    qty: 4
  },
  {
    name: "Album CD",
    qty: 7
  },
  {
    name: "PhotoBook",
    qty: 2
  },
  {
    name: "PhotoCard",
    qty: 1
  }
]

https://codesandbox.io/s/awesome-kalam-tthu3?file=/src/App.js

Буду благодарен!


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

Автор решения: vsemozhebuty

Можно использовать временную структуру-объект, собрать в ней суммы, а потом опять преобразовать в массив объектов:

const products1 = [
  {
    name: "Album DVD",
    qty: 1
  },
  {
    name: "Album CD",
    qty: 5
  },
  {
    name: "PhotoBook",
    qty: 2
  },
  {
    name: "Album DVD",
    qty: 3
  },
  {
    name: "Album CD",
    qty: 2
  },
  {
    name: "PhotoCard",
    qty: 1
  }
];

const temp = products1.reduce(
  (acc, { name, qty }) => {
    acc[name] = (acc[name] ?? 0) + qty;
    return acc;
  },
  {},
);

const products2 = Object.entries(temp).map(([name, qty]) => ({ name, qty }));

console.log(products2);

→ Ссылка