You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:22:28