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

求助:JavaScript循环中相同分数保持相同排名的实现方法

实现分数相同排名不变的思路

核心逻辑

要实现这个需求,关键是先按分数降序排序,再在遍历过程中记录上一个分数对应的排名,只有当当前分数与上一个分数不同时,才更新排名。

具体步骤

  • 第一步:将你的数据数组按分数从高到低排序,确保分数高的项排在前面。
  • 第二步:初始化两个变量:currentRank(记录当前生效的排名)和previousPoints(记录上一个项的分数)。
  • 第三步:遍历排序后的数组:
    • 如果当前项的分数和previousPoints相等,直接沿用currentRank作为当前项的排名;
    • 如果不相等,将currentRank更新为当前索引+1(因为数组从0开始计数),同时把previousPoints替换为当前项的分数。

代码示例

假设你的数据是包含用户信息和分数的对象数组:

// 示例数据
const scoreList = [
  { name: '玩家A', points: 120 },
  { name: '玩家B', points: 120 },
  { name: '玩家C', points: 105 },
  { name: '玩家D', points: 90 },
  { name: '玩家E', points: 90 },
  { name: '玩家F', points: 80 }
];

// 按分数降序排序
scoreList.sort((a, b) => b.points - a.points);

// 初始化变量
let currentRank = 1;
let previousPoints = scoreList[0]?.points;

// 遍历给每个项添加排名
scoreList.forEach((item, index) => {
  if (item.points !== previousPoints) {
    currentRank = index + 1;
    previousPoints = item.points;
  }
  item.rank = currentRank;
});

// 输出结果
scoreList.forEach(item => {
  console.log(`${item.rank}名 - ${item.name}:${item.points}分`);
});

可选的排名逻辑(并列后名次连续)

如果需要的是「并列后名次不跳过」(比如两个120分都是第1名,下一个105分直接是第2名,而非第3名),可以修改排名更新逻辑:

// 初始化变量
let currentRank = 1;
let previousPoints = scoreList[0]?.points;

scoreList.forEach((item, index) => {
  if (index === 0) {
    item.rank = currentRank;
  } else {
    if (item.points === previousPoints) {
      item.rank = currentRank;
    } else {
      currentRank++;
      item.rank = currentRank;
      previousPoints = item.points;
    }
  }
});

内容的提问来源于stack exchange,提问作者robrok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:20:25