Node.js中如何按相同分数分组均分奖金并更新原数组
Node.js 同分数玩家奖金平均分配最优实现
核心思路
整体采用两次线性遍历实现,时间复杂度为O(n),是该场景下性能最优的实现方式:
- 第一次遍历按
score分组,统计每个分数对应的奖金总和、玩家人数,预计算出该分数下的平均奖金 - 第二次遍历直接用预计算好的平均奖金更新对应玩家的
prize字段
可直接运行的实现代码
版本1:高性能版(直接修改原数组,适合大数据量场景)
const playerList = [ { id: 'something1', score: 180, rank: 1, avatar: 'avatar_3', prize: 1280 }, { id: 'something2', score: 180, rank: 2, avatar: 'avatar_3', prize: 1073 }, { id: 'something3', score: 161, rank: 3, avatar: 'avatar_2', prize: 902 }, { id: 'something4', score: 161, rank: 4, avatar: 'avatar_7', prize: 758 }, { id: 'something5', score: 161, rank: 5, avatar: 'avatar_8', prize: 535 }, { id: 'something6', score: 161, rank: 6, avatar: 'avatar_3', prize: 318 }, { id: 'something7', score: 143, rank: 7, avatar: 'avatar_3', prize: 267 }, { id: 'something8', score: 143, rank: 8, avatar: 'avatar_4', prize: 224 }, { id: 'something9', score: 140, rank: 9, avatar: 'avatar_3', prize: 210 } ]; // 按score分组统计奖金总额、人数 const scoreStatMap = new Map(); for (const player of playerList) { const { score, prize } = player; if (!scoreStatMap.has(score)) { scoreStatMap.set(score, { totalPrize: 0, playerCount: 0 }); } const stat = scoreStatMap.get(score); stat.totalPrize += prize; stat.playerCount += 1; } // 预计算每个分数的平均奖金,Math.floor和示例取整规则完全匹配,可按需替换为Math.round等 for (const [score, stat] of scoreStatMap) { stat.avgPrize = Math.floor(stat.totalPrize / stat.playerCount); } // 更新原数组的prize字段 for (const player of playerList) { player.prize = scoreStatMap.get(player.score).avgPrize; }
版本2:不可变数据版(返回新数组,不修改原始数据)
如果业务场景不允许修改原始输入数组,可以用函数式写法,时间复杂度同样为O(n):
const scoreStatMap = playerList.reduce((map, player) => { const stat = map.get(player.score) ?? { totalPrize: 0, playerCount: 0 }; stat.totalPrize += player.prize; stat.playerCount += 1; map.set(player.score, stat); return map; }, new Map()); const result = playerList.map(player => ({ ...player, prize: Math.floor( scoreStatMap.get(player.score).totalPrize / scoreStatMap.get(player.score).playerCount ) }));
方案优势
- 性能最优:没有嵌套循环、没有重复的分组过滤操作,遍历次数固定为2次,数据量越大性能优势越明显
- 可靠性高:用
Map做分组存储,读写效率高于普通对象,且不会受对象原型链属性干扰 - 易维护:统计逻辑和更新逻辑分离,后续调整取整规则、新增统计字段都很方便
- 结果完全匹配需求:运行后输出的数组和给出的预期结果完全一致
内容的提问来源于stack exchange,提问作者Suneel K Khatri
相关产品推荐
相关产品推荐

