Как вместо дублирования увеличивать количество одинаковых id

введите сюда описание изображения


Как вывести массив где amount одинаковых id меняется в зависимости от количества одинаковых id


массив с количеством одинаковых элементов


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

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

Предлагаю такой вариант, сначала сгруппировал массив по id и потом сложил количество и значение для получения необходимого результата

Функция:

const items = [
    { id: '2', name: 'Яблоко', value: 36, amount: 2 },
    { id: '2', name: 'Яблоко', value: 18, amount: 1 },
    { id: '2', name: 'Яблоко', value: 18, amount: 1 },
    { id: '2', name: 'Яблоко', value: 18, amount: 1 },
    { id: '1', name: 'Груша', value: 76, amount: 4 },
    { id: '1', name: 'Груша', value: 19, amount: 1 },
    { id: '1', name: 'Груша', value: 19, amount: 1 },
    { id: '1', name: 'Груша', value: 19, amount: 1 },
    { id: '3', name: 'Банан', value: 153, amount: 9 },
    { id: '3', name: 'Банан', value: 17, amount: 1 },
]

const groupedItems = Object.groupBy(items, ({ id }) => id)

const totalAmountItems = Object.values(groupedItems).map((items) => {
    const amount = items.reduce((acc, { amount }) => amount + acc, 0)
    const totalValue = items.reduce((acc, { value }) => value + acc, 0)
    return {
        ...items[0],
        amount,
        totalValue,
    }
});

console.log(
  totalAmountItems
    .map(({ name, amount, totalValue}) => `${name} ${totalValue} - ${amount}шт.`)
    .join('\n')
)

→ Ссылка
Автор решения: Grundy

Для простой группировки проще воспользоваться одним reduce и сразу собрать все важные данные в нужном формате за один проход:

const items = [{
    id: '2',
    name: 'Яблоко',
    value: 36,
    amount: 2
  },
  {
    id: '2',
    name: 'Яблоко',
    value: 18,
    amount: 1
  },
  {
    id: '2',
    name: 'Яблоко',
    value: 18,
    amount: 1
  },
  {
    id: '2',
    name: 'Яблоко',
    value: 18,
    amount: 1
  },
  {
    id: '1',
    name: 'Груша',
    value: 76,
    amount: 4
  },
  {
    id: '1',
    name: 'Груша',
    value: 19,
    amount: 1
  },
  {
    id: '1',
    name: 'Груша',
    value: 19,
    amount: 1
  },
  {
    id: '1',
    name: 'Груша',
    value: 19,
    amount: 1
  },
  {
    id: '3',
    name: 'Банан',
    value: 153,
    amount: 9
  },
  {
    id: '3',
    name: 'Банан',
    value: 17,
    amount: 1
  },
]

const totalAmountItems = items.reduce(({
  map,
  res
}, {
  id,
  name,
  value,
  amount
}) => {
  let item = map.get(id); // получаем элемент по id
  if (!item) { // если такого элемента еще не было, 
    item = {
      id,
      name,
      totalValue: value,
      amount
    }
    map.set(id, item); // добавляем его в словарь
    res.push(item); // добавляем его в результат
  } else { // если был - обновляем значения
    item.totalValue += value;
    item.amount += amount;
  }
  return {
    map,
    res
  }
}, {
  map: new Map(),
  res: []
}).res;

console.log(
  totalAmountItems
  .map(({
    name,
    amount,
    totalValue
  }) => `${name} ${totalValue} - ${amount}шт.`)
  .join('\n')
)

→ Ссылка