Как вместо дублирования увеличивать количество одинаковых 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')
)

