diff --git a/src/pages/match-detail.vue b/src/pages/match-detail.vue index 66eb93c..f5d5e38 100644 --- a/src/pages/match-detail.vue +++ b/src/pages/match-detail.vue @@ -20,25 +20,47 @@ onLoad(async (options) => { const result = await getBattleAPI(battleId.value); data.value = result; if (result.mode > 3) { - players.value = result.resultList.map((item, index) => { - const plist = result.teams[0] ? result.teams[0].players : []; - const p = plist.find((p) => p.id === item.userId); + const plist = result.teams[0] ? result.teams[0].players : []; + // 以 id 为 key 建立 teams 玩家快速查找表 + const teamPlayerMap = {}; + plist.forEach((p) => { teamPlayerMap[p.id] = p; }); + + // 处理有成绩的玩家(resultList 顺序即排名顺序) + const rankedPlayers = (result.resultList || []).map((item, index) => { + const playerId = item.userId || item.id; + const p = teamPlayerMap[playerId] || item; const arrows = new Array(12); - result.rounds.forEach((r, index) => { - if (r.shoots[item.userId]) { - r.shoots[item.userId].forEach((s, index2) => { - arrows[index2 + index * 6] = s; + result.rounds.forEach((r, rIndex) => { + if (r.shoots[playerId]) { + r.shoots[playerId].forEach((s, sIndex) => { + arrows[sIndex + rIndex * 6] = s; }); } }); return { ...item, + id: playerId, rank: index + 1, - name: p.name, - avatar: p.avatar || "", + name: (p && p.name) || item.name, + avatar: (p && p.avatar) || item.avatar || "", arrows, }; }); + + // 追加未出现在 resultList 中的玩家(未射箭),rank=0 隐藏角标 + const rankedIds = new Set(rankedPlayers.map((p) => p.id)); + const unrankedPlayers = plist + .filter((p) => !rankedIds.has(p.id)) + .map((p) => ({ + id: p.id, + name: p.name, + avatar: p.avatar || "", + arrows: [], + totalScore: 0, + rank: 0, + })); + + players.value = [...rankedPlayers, ...unrankedPlayers]; } }); @@ -59,13 +81,14 @@ const checkBowData = (selected) => { @@ -76,14 +99,14 @@ const checkBowData = (selected) => { { }; const getName = (battle) => { if (battle.mode <= 3) return `${battle.mode}V${battle.mode}`; - return battle.mode + "人大乱斗"; + // 排位赛大乱斗:mode 数字与实际人数不一致,使用固定映射 + if (battle.way === 2) { + if (battle.mode === 4) return "5人大乱斗"; + if (battle.mode === 5) return "10人大乱斗"; + } + // 好友约战大乱斗:从 teams[0].players 取实际参与人数动态展示 + const count = battle.teams?.[0]?.players?.length; + return count ? `${count}人大乱斗` : "大乱斗"; }; /**