JavaScript如何统计嵌套对象数组中玩家各轮累计总票数
多回合累计得票统计实现
直接复用你已封装的单回合统计方法,通过玩家唯一ID做聚合累加即可,完全兼容项目中类实例的玩家对象场景,代码如下:
const getTotalVotesAllRounds = () => { // 以玩家ID为键建立哈希表,避免重复统计,保留原始玩家对象引用 const voteMap = {}; // 遍历所有游戏回合 for (let roundIdx = 0; roundIdx < roundHistory.length; roundIdx++) { // 直接调用已有的单回合统计方法,不需要重复实现单回合逻辑 const roundVoteData = getTotalReceivedVotesPerPlayerInRound(roundIdx); roundVoteData.forEach(record => { const playerId = record.player.id; // 首次遇到该玩家时初始化统计记录 if (!voteMap[playerId]) { voteMap[playerId] = { player: record.player, // 直接存原始玩家对象/类实例,不丢失自定义方法 totalVotes: 0 }; } // 累加当前回合得票数 voteMap[playerId].totalVotes += record.totalVotes; }); } // 转换为你需要的数组结构返回 return Object.values(voteMap); }; // 调用示例 const result = getTotalVotesAllRounds(); console.log(result);
注意点
- 聚合时使用玩家
id作为唯一标识,不受玩家对象属性变动、类实例方法扩展影响,统计稳定性高 - 完全复用现有单回合统计逻辑,后续如果单回合计票规则调整(比如无效票过滤、加权计票),全量统计不需要修改代码会自动适配
- 返回结果中的
player字段是原始玩家对象的引用,你在类上封装的所有工具方法都可以正常调用 - 针对你给出的两回合完全相同的测试数据,返回结果中player1累计得4票、player2累计得2票、player3累计得0票;如果你预期的结果是2/1/0,检查下
roundHistory的实际长度,确认是否只存入了单回合数据。
内容的提问来源于stack exchange,提问作者Behemoth
相关产品推荐
相关产品推荐

