Перебрать массив объектов с ключами
Есть массив Users, который состоит из n объектов.
let users = [
{
idu: 'btI3E8AHH0ct80V5nwvVBfXnCDh2', name: 'Илья', score: 10
},
{
idu: 'btI3E8AHH0ct80V5nwvVBfXnCDh2', name: 'Илья', score: 15
},
{
idu: '45gtGXaFghNc3x3n7WFFd5etSfS2', name: 'Петя', score: 6
},
{
idu: '45gtGXaFghNc3x3n7WFFd5etSfS2', name: Петя, score: 2
}
]
Необходимо сложить score у каждого отдельного юзера.
Ожидаемый результат - массив с объектами
{
idu: 'btI3E8AHH0ct80V5nwvVBfXnCDh2', name: 'Илья', score: 25
},
{
idu: '45gtGXaFghNc3x3n7WFFd5etSfS2', name: 'Петя', score: 8
}
Подскажите пожалуйста, как это сделать?
Ответы (1 шт):
Автор решения: vsemozhebuty
→ Ссылка
Когда вам нужно объединить массив объектов на основании какого-то ключа, удобнее всего использовать временный объект со значениями этого ключа, а потом просто превратить его в массив его значений. Например, так:
let users = [
{
idu: 'btI3E8AHH0ct80V5nwvVBfXnCDh2', name: 'Илья', score: 10
},
{
idu: 'btI3E8AHH0ct80V5nwvVBfXnCDh2', name: 'Илья', score: 15
},
{
idu: '45gtGXaFghNc3x3n7WFFd5etSfS2', name: 'Петя', score: 6
},
{
idu: '45gtGXaFghNc3x3n7WFFd5etSfS2', name: 'Петя', score: 2
}
];
const usersSum = Object.values(users.reduce(
(acc, { idu, name, score }) => {
acc[idu] ??= { idu, name, score: 0 };
acc[idu].score += score;
return acc;
},
{},
));
console.log(usersSum);
Или чуть более развёрнуто:
let users = [
{
idu: 'btI3E8AHH0ct80V5nwvVBfXnCDh2', name: 'Илья', score: 10
},
{
idu: 'btI3E8AHH0ct80V5nwvVBfXnCDh2', name: 'Илья', score: 15
},
{
idu: '45gtGXaFghNc3x3n7WFFd5etSfS2', name: 'Петя', score: 6
},
{
idu: '45gtGXaFghNc3x3n7WFFd5etSfS2', name: 'Петя', score: 2
}
];
const temp = {};
for (const user of users) {
if (!temp[user.idu]) temp[user.idu] = { idu: user.idu, name: user.name, score: 0 };
temp[user.idu].score += user.score;
}
const usersSum = Object.values(temp);
console.log(usersSum);