JavaScript中计算对象数组内各用户的总点赞数
如何计算对象数组中每个用户的总点赞数?
没问题,我来帮你梳理这个计算用户总点赞数的逻辑——核心思路就是分组求和,一步步拆解给你看:
核心逻辑步骤
第一步:分组存储用户点赞数
先准备一个临时对象,用用户的username(或者更严谨的authorId,避免用户名重复的情况)作为键,对应的值用来累计该用户的总点赞数。第二步:遍历数组累加点赞
循环遍历每一篇文章:- 如果临时对象里已经有该用户的条目,就把当前文章的
likes加到已有的累计值上; - 如果没有,就初始化这个用户的条目,把当前文章的
likes设为初始值。
- 如果临时对象里已经有该用户的条目,就把当前文章的
第三步:转换为期望的数组格式
把临时对象的键值对,转换成{ username: 'xxx', totalLikes: xxx }的对象结构,再收集成数组,就是你要的结果了。
代码实现(两种方式)
方式一:用reduce优雅实现(推荐)
reduce方法天生适合这种累加分组的场景,代码更简洁:
const articles = [{ authorId: "2vP3i2rYvDYPrikE1k1DTaZDeoq1", dislikes: 0, likes: 3, neutral: 0, text: "This is Mike Alice's first Shot!!", username: "mikealice", id: "NMFGbeTvSYddsr7VzjFV", }, { authorId: "2vP3i2rYvDYPrikE1k1DTaZDeoq1", dislikes: 0, likes: 2, neutral: 0, text: "This is Mike Alice's second Shot!!", username: "mikealice", id: "NMFGbeTvSYddsr7VzjFV", }, { authorId: "2vP3i2rYvDYPrikE1k1klkDTaZDeoq1", dislikes: 0, likes: 1, neutral: 0, text: "This is admin's first Shot!!", username: "admin", id: "NMFGbeTvSYddsr7VzjFV", }, { authorId: "2vP3i2rYvDYPrikE1k1klkDTaZDeoq1", dislikes: 0, likes: 3, neutral: 0, text: "This is admin's second Shot!!", username: "admin", id: "NMFGbeTvSYddsr7VzjFV", }]; // 用reduce分组累加,再转换为目标数组 const userLikes = Object.entries( articles.reduce((acc, article) => { // 这里用username作为分组键,也可以换成authorId更严谨 const key = article.username; acc[key] = (acc[key] || 0) + article.likes; return acc; }, {}) ).map(([username, totalLikes]) => ({ username, totalLikes })); console.log(userLikes); // 输出:[{ username: 'mikealice', totalLikes: 5 }, { username: 'admin', totalLikes: 4 }]
方式二:普通for循环(适合新手理解)
如果对reduce不太熟悉,用普通循环也能达到同样效果,逻辑更直观:
const articles = [{ /* 同上的数组内容 */ }]; // 第一步:临时对象存储累计点赞数 const userLikesObj = {}; for (const article of articles) { const username = article.username; if (userLikesObj[username]) { userLikesObj[username] += article.likes; } else { userLikesObj[username] = article.likes; } } // 第二步:转换为目标数组格式 const userLikes = []; for (const username in userLikesObj) { userLikes.push({ username, totalLikes: userLikesObj[username] }); } console.log(userLikes); // 输出和上面一致
小提示
如果担心存在用户名重复的情况(比如两个不同用户用了同一个username),建议改用authorId作为分组键,这样能保证分组的准确性。
内容的提问来源于stack exchange,提问作者Frank Atukunda
相关产品推荐
相关产品推荐

