Сложить значения в объектах с одинаковым ID
Есть массив:
let users = [{id: 1, balance: 5}, {id:2, balance: 6}, {id: 1, balance: 1}]
Надо чтобы у объектов с одинаковыми id сложился balance, то есть получилось так:
let users = [{id: 1, balance: 6}, {id:2, balance: 6}]
Ответы (2 шт):
Автор решения: vsemozhebuty
→ Ссылка
Можно, например, такими двумя способами. Первый выглядит проще, но он менее эффективный (множественные прохождения по формируемому массиву). Второй использует промежуточную структуру, но меньше промежуточных операций.
{
const users = [{id: 1, balance: 5}, {id: 2, balance: 6}, {id: 1, balance: 1}];
const users1 = users.reduce((acc, entry) => {
const id = entry.id;
const same = acc.find( element => element.id === id);
if (same !== undefined) same.balance += entry.balance;
else acc.push(entry);
return acc;
}, []);
console.log(users1);
}
{
const users = [{id: 1, balance: 5}, {id: 2, balance: 6}, {id: 1, balance: 1}];
const users2 = Object.entries(users.reduce((acc, entry) => {
const id = entry.id;
if (acc[id] !== undefined) acc[id] += entry.balance;
else acc[id] = entry.balance;
return acc;
}, {})).map(([id, balance]) => ({ id: Number(id), balance }));
console.log(users2);
}
Автор решения: Александр Федоренко
→ Ссылка
let users = [{id: 1, balance: 5}, {id:2, balance: 66}, {id: 1, balance: 11}]
let result = [];
users.forEach( item => {
if(result.every(c=>c.id!==item.id))
result.push({id: item.id, balance:item.balance})
else result.forEach((r, i) => {
if(r.id===item.id)
result[i].balance = result[i].balance + item.balance
})
})
console.log(result);