如何统计users数组中同一用户的所有消息总长度?现有代码求修正
统计用户消息长度总和的正确实现方式
我看了你写的代码,发现几个关键问题导致它没法正常统计用户消息长度总和:
- 初始的
score是空数组,第一次执行外层循环时,内层的for (s of score)根本不会运行,所以第一个用户的数据根本不会被添加进去。 - 逻辑完全搞反了:找到同名用户时,你应该累加已有用户的counter,而不是新增一条记录;只有当遍历完
score都没找到同名用户时,才需要新增一个统计项。
修正你的for循环实现
先把逻辑理顺,调整后的代码如下:
const score = []; for (const item of users) { const userName = item.user.name; const msgLength = item.user.msg.length; // 先找是否已有该用户的统计项 const existingUser = score.find(s => s.name === userName); if (existingUser) { // 找到就累加长度 existingUser.counter += msgLength; } else { // 没找到就新增 score.push({ name: userName, counter: msgLength }); } }
更简洁的reduce实现
其实用数组的reduce方法来处理这种“分组累加”的场景会更优雅,代码更紧凑:
const score = users.reduce((acc, item) => { const userName = item.user.name; const msgLength = item.user.msg.length; // 查找累加器中是否已有该用户 const user = acc.find(u => u.name === userName); if (user) { user.counter += msgLength; } else { acc.push({ name: userName, counter: msgLength }); } return acc; }, []); // 初始值是空数组
性能优化小提示
如果你的users数组很大,用find每次遍历score会有点慢,这时可以先用对象来暂存统计结果,最后再转成数组,效率会更高:
const tempObj = users.reduce((acc, item) => { const userName = item.user.name; const msgLength = item.user.msg.length; acc[userName] = (acc[userName] || 0) + msgLength; return acc; }, {}); // 把对象转成你需要的数组格式 const score = Object.entries(tempObj).map(([name, counter]) => ({ name, counter }));
内容的提问来源于stack exchange,提问作者Reza Saadati
相关产品推荐
相关产品推荐

