求助: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
相关产品推荐
相关产品推荐

