You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按用户名聚合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参数)。
  • 遍历每个玩家数据时:
    1. 先检查聚合容器里有没有当前用户的条目;
    2. 如果有,就往该用户的记录数组里新增一条,id用已有记录的长度实现自增;
    3. 如果没有,就创建一个新的用户对象,把当前对战记录作为第一条存入。

如果你还是想用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 14:07:43