如何按用户名聚合API返回的玩家对战数据?替代for循环方案探讨
如何将对战数据按用户名聚合为指定格式?
首先得说,你当前的getmatchdata()函数存在几个问题:一是它找到第一个匹配username的玩家就直接return了,只能拿到单条数据,没法收集同一用户的多场对战记录;二是变量作用域有点问题(username在if块里定义,但判断条件却用了外部的username)。
要实现你想要的聚合格式,Array.reduce()是比普通for循环更优的方案——它专门用来处理这种“把数组聚合为特定结构”的场景,代码更简洁、可读性更强。
完整实现代码
// 先获取所有对战数据(修正原代码逻辑,拿到所有玩家的对战记录) const matchlistResponse = await fetch(`https://api.site.com/match/get?_=&id=${id}`); const matchlistResponsestats = await matchlistResponse.json(); const allPlayerStats = matchlistResponsestats.players; // 使用reduce聚合数据 const aggregatedData = allPlayerStats.reduce((acc, player) => { // 检查当前用户是否已经在聚合结果里 const existingUser = acc.find(item => Object.keys(item)[0] === player.username); if (existingUser) { // 如果存在,给该用户新增一条对战记录,id用已有记录的长度实现自增 existingUser[player.username].push({ id: existingUser[player.username].length, kills: player.kills, deaths: player.deaths, headshots: player.headshots }); } else { // 如果不存在,创建新的用户条目,id从0开始 acc.push({ [player.username]: [{ id: 0, kills: player.kills, deaths: player.deaths, headshots: player.headshots }] }); } return acc; }, []); console.log(aggregatedData);
代码解释
reduce()的初始值是一个空数组[],我们把它当作存放聚合结果的容器(acc参数)。- 遍历每个玩家数据时:
- 先检查聚合容器里有没有当前用户的条目;
- 如果有,就往该用户的记录数组里新增一条,
id用已有记录的长度实现自增; - 如果没有,就创建一个新的用户对象,把当前对战记录作为第一条存入。
如果你还是想用for循环(兼容旧习惯)
当然也可以用for循环实现,逻辑和reduce一致,只是代码稍显冗长:
const aggregatedData = []; const allPlayerStats = matchlistResponsestats.players; for (let i = 0; i < allPlayerStats.length; i++) { const player = allPlayerStats[i]; const existingIndex = aggregatedData.findIndex(item => Object.keys(item)[0] === player.username); if (existingIndex !== -1) { const userRecords = aggregatedData[existingIndex][player.username]; userRecords.push({ id: userRecords.length, kills: player.kills, deaths: player.deaths, headshots: player.headshots }); } else { aggregatedData.push({ [player.username]: [{ id: 0, kills: player.kills, deaths: player.deaths, headshots: player.headshots }] }); } } console.log(aggregatedData);
两种方案都能得到你想要的格式,但reduce()更符合函数式编程的风格,代码更紧凑,也更易维护。
内容的提问来源于stack exchange,提问作者Hygge Hjørnet
相关产品推荐
相关产品推荐

