
本文介绍如何基于多场游戏数据,按玩家唯一 id(appuserid)分组聚合其所属团队在每场比赛中获得的分数,并生成带 totalscore 字段的玩家汇总列表。
本文介绍如何基于多场游戏数据,按玩家唯一 id(appuserid)分组聚合其所属团队在每场比赛中获得的分数,并生成带 totalscore 字段的玩家汇总列表。
在构建实时记分板(scoreboard)类应用时,常需从结构化比赛数据中提取每位玩家的累计得分。本例中,每场 game 包含两个团队得分(teamOneScore 和 teamTwoScore),以及参与该场的所有 players;每位玩家通过 team 字段(值为 1 或 2)标识其归属队伍——其当场比赛得分即为对应团队的全场得分。
核心逻辑在于:按 appUserId 唯一标识玩家,遍历所有比赛中的所有玩家,根据其 team 值选择 teamOneScore 或 teamTwoScore 累加至该玩家的 totalScore。为保证高性能(O(n) 时间复杂度),我们采用哈希索引(playersIdx)记录每位玩家在结果数组 players 中的位置,避免重复查找。
以下是完整、可直接运行的实现代码:
const playersIdx = {}; // 存储 appUserId → players 数组下标的映射
const players = []; // 最终结果:去重且含 totalScore 的玩家数组
games.forEach(game => {
game.players.forEach(player => {
const { appUserId, team, ...rest } = player;
const score = team === 1 ? game.teamOneScore : game.teamTwoScore;
if (playersIdx.hasOwnProperty(appUserId)) {
// 已存在:累加得分
players[playersIdx[appUserId]].totalScore += score;
} else {
// 新玩家:初始化并存入
const newPlayer = {
...rest,
appUserId,
totalScore: score
};
players.push(newPlayer);
playersIdx[appUserId] = players.length - 1;
}
});
});
✅ 关键说明与注意事项:
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
- 使用
hasOwnProperty替代空值合并操作符(??)更严谨,避免原型链污染风险; - 解构赋值
const { appUserId, team, ...rest }自动剔除team字段,确保输出对象不含冗余属性; - 不依赖外部库(如 Lodash),纯原生 JavaScript 实现,兼容性好(ES6+);
- 若需保留原始
team字段用于后续展示,可移除解构中的team并在newPlayer中显式添加(如team: player.team); - 结果中
players顺序取决于首次出现顺序,如需按username或得分排序,可在最后调用.sort()。
执行后,players 即为符合预期的汇总数组:
[
{
"username": "waters",
"displayName": "Waters Adkins",
"gender": "M",
"image": null,
"appUserId": "86ba61dd-df18-4c42-b788-1d859507bab1",
"totalScore": 20
},
{
"username": "whitney",
"displayName": "Whitney Winters",
"gender": "F",
"image": null,
"appUserId": "c22bfafa-337a-4cbd-840d-e60adeb23625",
"totalScore": 45
}
]
该方案兼具可读性、性能与健壮性,适用于中等规模赛事数据聚合场景。如需扩展支持多团队(>2)、动态团队映射或异步数据流,可在此基础上引入 Map、Reducer 或 Observable 模式进一步演进。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










