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

Node.js中如何按相同分数分组均分奖金并更新原数组

Node.js 同分数玩家奖金平均分配最优实现

核心思路

整体采用两次线性遍历实现,时间复杂度为O(n),是该场景下性能最优的实现方式:

  1. 第一次遍历按score分组,统计每个分数对应的奖金总和、玩家人数,预计算出该分数下的平均奖金
  2. 第二次遍历直接用预计算好的平均奖金更新对应玩家的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:18:52