如何按胜负属性排序对象数组?锦标赛排名代码异常排查
锦标赛对阵表排序问题解决
核心问题分析
你当前代码未执行循环、导致standingsTeams为空的原因很明确:
- 你定义的
tourneyTeamsCondensed是单个对象,但对象没有.length属性,外层循环i < tourneyTeamsCondensed.length的条件永远不成立(undefined < 0为false),循环直接跳过。 - 同时你写的对象语法存在错误:同一个对象里重复的key(比如多个
name、wins)会被最后一个值覆盖,实际tourneyTeamsCondensed中仅保留了Team4的数据,这也是后续排序无效的隐形问题。
解决步骤
1. 修正数据源结构
将tourneyTeamsCondensed改为对象数组,每个球队作为独立对象存储,这才是多组数据的正确存储方式:
const tourneyTeamsCondensed = [ {"name": "Team1","wins": "2","losses": "4"}, {"name": "Team2","wins": "3","losses": "3"}, {"name": "Team3","wins": "3","losses": "4"}, {"name": "Team4","wins": "4","losses": "1"} ];
2. 简化排序逻辑(推荐方案)
放弃繁琐的嵌套循环,直接使用数组原生sort()方法,同时注意将字符串类型的wins和losses转为数字再比较(避免字符串比较的逻辑错误,比如"10" < "2"):
// 复制原数组避免修改原始数据 const standingsTeams = [...tourneyTeamsCondensed]; // 按规则排序:先胜场降序,胜场相同则负场升序 standingsTeams.sort((a, b) => { const winsDiff = Number(b.wins) - Number(a.wins); if (winsDiff !== 0) return winsDiff; return Number(a.losses) - Number(b.losses); }); console.log(standingsTeams);
3. 原代码的兼容修正(若需保留嵌套循环逻辑)
如果坚持使用你原来的插入排序逻辑,除了修正数据源为数组,还需将字符串转为数字再比较:
const tourneyTeamsCondensed = [ {"name": "Team1","wins": "2","losses": "4"}, {"name": "Team2","wins": "3","losses": "3"}, {"name": "Team3","wins": "3","losses": "4"}, {"name": "Team4","wins": "4","losses": "1"} ]; const standingsTeams = []; for (var i = 0; i < tourneyTeamsCondensed.length; i++) { var insertCheck = false; for (var j = 0; j < standingsTeams.length; j++) { // 转换为数字后再比较 const currentWins = Number(tourneyTeamsCondensed[i].wins); const currentLosses = Number(tourneyTeamsCondensed[i].losses); const targetWins = Number(standingsTeams[j].wins); const targetLosses = Number(standingsTeams[j].losses); if (currentWins > targetWins || (currentWins === targetWins && currentLosses < targetLosses)) { insertCheck = true; standingsTeams.splice(j, 0, tourneyTeamsCondensed[i]); break; } } if (!insertCheck) { standingsTeams.push(tourneyTeamsCondensed[i]); } } console.log(standingsTeams);
最终效果
运行修正后的代码,standingsTeams会输出你期望的排序结果:
[ {"name": "Team4","wins": "4","losses": "1"}, {"name": "Team2","wins": "3","losses": "3"}, {"name": "Team3","wins": "3","losses": "4"}, {"name": "Team1","wins": "2","losses": "4"} ]
内容的提问来源于stack exchange,提问作者Ozan
相关产品推荐
相关产品推荐

