如何对关联的players与scores数组排序并生成玩家排名?
解决玩家分数排名排序的问题
嘿,我明白你现在卡在排序这一步了——用两个分开的数组存玩家和分数确实容易在排序时搞混对应关系,别担心,我来帮你搞定!
核心问题分析
单独维护players和scores两个数组的话,排序分数数组时,玩家数组的顺序不会同步变化,最后会出现玩家和分数不匹配的情况。所以最佳方案是把每个玩家和对应的分数包装成一个对象,放在同一个数组里,这样排序时整个“玩家-分数”单元会一起移动,完全不会错位。
完整解决方案代码
下面是补全并优化后的代码,包含录入、排序、输出全流程:
function main() { var players = new Array(); var scores = new Array(); // 1. 录入3位玩家的名字和分数 for(i = 0; i < 3; i++) { var playerName = prompt(`请输入第${i+1}位玩家的名字:`); // 转成数字类型,避免字符串排序出错 var playerScore = parseInt(prompt(`请输入${playerName}的分数:`)); players.push(playerName); scores.push(playerScore); } // 2. 将两个数组合并为对象数组(关键步骤!) var playerScorePairs = []; for(let j = 0; j < players.length; j++) { playerScorePairs.push({ name: players[j], score: scores[j] }); } // 3. 按分数从高到低排序 playerScorePairs.sort((a, b) => { // b.score - a.score 实现降序,a - b则是升序 return b.score - a.score; }); // 4. 输出排名结果 console.log("最终排名:"); playerScorePairs.forEach((item, index) => { console.log(`${index+1}. ${item.name}(${item.score}分)`); }); } // 调用主函数 main();
更简洁的写法(直接录入对象)
其实我们可以跳过单独维护两个数组的步骤,直接在录入时创建对象数组,代码更精简:
function main() { var playerScorePairs = []; // 直接录入并构建对象数组 for(i = 0; i < 3; i++) { var playerName = prompt(`请输入第${i+1}位玩家的名字:`); var playerScore = parseInt(prompt(`请输入${playerName}的分数:`)); playerScorePairs.push({ name: playerName, score: playerScore }); } // 排序 + 输出 playerScorePairs.sort((a, b) => b.score - a.score); console.log("最终排名:"); playerScorePairs.forEach((item, idx) => { console.log(`${idx+1}. ${item.name}(${item.score}分)`); }); } main();
测试你的示例
当录入Jeremy(12)、Julien(18)、Olivia(22)时,代码会输出:
最终排名: 1. Olivia(22分) 2. Julien(18分) 3. Jeremy(12分)
完全符合你的预期!
内容的提问来源于stack exchange,提问作者user9281020
相关产品推荐
相关产品推荐

