我有一个名为users
的数组,其中包含一个对象,如下所示:
'user': {
'name': name,
'msg': msg
}
有可能在该阵列中多次列出用户。
我想计算他所有消息的长度(msg
)。
这是我尝试的方式:
score = [];
for (i of users) {
for (s of score) {
if (s.name === i.user.name) {
score.push({
'name': i.user.name,
'counter': i.user.msg.length
});
}
else {
s.counter = s.counter + i.user.msg.length;
}
}
}
包含对象的数组score
应该只包含唯一用户。所以他们不应该被列出两次。
无论如何,这不起作用,我对我的代码不满意,因为必须有一个更好,更简单的解决方案。
答案 0 :(得分:1)
您可以使用对象代替score
的数组,并使用user.name
作为关键字:
const score = {};
for (const user of users) {
if (score[user.name]) {
score[user.name].counter += user.msg.length;
} else {
score[user.name] = {
name: user.name,
counter: user.msg.length,
}
}
}
答案 1 :(得分:1)
您可以使用reduce
将分数转换为所有唯一值的地图。
获得该地图后,如果需要,可以将其转换为数组。
const users = [
{
name: 'user1',
msg: 'hello',
},
{
name: 'user1',
msg: 'hello2',
},
{
name: 'user2',
msg: 'world',
},
{
name: 'user2',
msg: 'world2',
},
{
name: 'user3',
msg: 'foo',
},
];
const scores = users.reduce((scores, {name, msg}) => {
if (!scores[name]) {
scores[name] = { name, counter: 0 };
}
scores[name].counter += msg.length;
return scores;
}, {});
// Now convert to an array if you want
console.log(Object.entries(scores));