计算来自同一用户的消息长度

时间:2018-04-19 20:36:14

标签: javascript

我有一个名为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应该只包含唯一用户。所以他们不应该被列出两次。

无论如何,这不起作用,我对我的代码不满意,因为必须有一个更好,更简单的解决方案。

2 个答案:

答案 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));