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

如何在Electron的HTML表格中为每个玩家添加统计数据行?

解决方案

1. 整理玩家数据为数组格式

先把从.log文件提取到的玩家用户名整理成数组,确保能批量处理:

// 示例:从log提取后得到的玩家名数组
const playerNames = ["PlayerA", "PlayerB", "PlayerC"];

2. 批量获取玩家Bedwars统计数据

遍历玩家数组,调用Hypixel API批量获取数据,用Promise.all处理异步请求,避免单玩家请求的局限性:

async function fetchAllPlayerStats(playerNames) {
  const apiKey = "你的Hypixel API密钥";
  const statsPromises = playerNames.map(async (name) => {
    // 先通过用户名获取玩家UUID
    const uuidRes = await fetch(`https://api.mojang.com/users/profiles/minecraft/${name}`);
    const uuidData = await uuidRes.json();
    if (!uuidData.id) return null;

    // 获取Bedwars统计数据
    const statsRes = await fetch(`https://api.hypixel.net/player?key=${apiKey}&uuid=${uuidData.id}`);
    const statsData = await statsRes.json();
    if (!statsData.player?.stats?.Bedwars) return null;

    const bedwarsStats = statsData.player.stats.Bedwars;
    const wins = bedwarsStats.wins_bedwars || 0;
    const finalKills = bedwarsStats.final_kills_bedwars || 0;
    const finalDeaths = bedwarsStats.final_deaths_bedwars || 1; // 避免除以0报错
    const fkdr = (finalKills / finalDeaths).toFixed(2);

    return {
      username: name,
      wins,
      finalKills,
      fkdr
    };
  });

  // 过滤掉获取失败的玩家数据
  return (await Promise.all(statsPromises)).filter(stat => stat !== null);
}

3. 动态生成多玩家表格行

拿到所有玩家数据后,循环生成表格行并插入到表格主体中,替换原有的单行逻辑:

function renderPlayerTable(playerStats) {
  const tableBody = document.getElementById("playerStatsTable").querySelector("tbody");
  // 清空现有行,避免重复渲染
  tableBody.innerHTML = "";

  playerStats.forEach(stat => {
    const row = document.createElement("tr");
    row.innerHTML = `
      <td>${stat.username}</td>
      <td>${stat.wins}</td>
      <td>${stat.finalKills}</td>
      <td>${stat.fkdr}</td>
    `;
    tableBody.appendChild(row);
  });
}

对应的基础HTML表格结构:

<table id="playerStatsTable">
  <thead>
    <tr>
      <th>用户名</th>
      <th>胜场数</th>
      <th>最终击杀数</th>
      <th>FKDR</th>
    </tr>
  </thead>
  <tbody></tbody>
</table>

4. 绑定更新触发逻辑

在checkForUpdates函数中,重新提取玩家数据、拉取最新统计并更新表格:

async function checkForUpdates() {
  // 重新从log文件提取玩家名
  const newPlayerNames = extractPlayerNamesFromLog("你的log文件路径");
  // 获取最新统计数据
  const newPlayerStats = await fetchAllPlayerStats(newPlayerNames);
  // 更新表格内容
  renderPlayerTable(newPlayerStats);
}

5. 增量更新优化(可选)

如果不想每次清空表格,可对比新旧数据,只更新变化的行:

async function updatePlayerTable() {
  const newPlayerNames = extractPlayerNamesFromLog("你的log文件路径");
  const newPlayerStats = await fetchAllPlayerStats(newPlayerNames);
  const tableBody = document.getElementById("playerStatsTable").querySelector("tbody");
  const existingRows = Array.from(tableBody.querySelectorAll("tr"));

  // 移除已离开 lobby 的玩家行
  existingRows.forEach(row => {
    const username = row.querySelector("td").textContent;
    if (!newPlayerStats.some(stat => stat.username === username)) {
      row.remove();
    }
  });

  // 更新现有玩家数据或新增新玩家行
  newPlayerStats.forEach(stat => {
    const existingRow = existingRows.find(row => row.querySelector("td").textContent === stat.username);
    if (existingRow) {
      // 更新数据
      existingRow.innerHTML = `
        <td>${stat.username}</td>
        <td>${stat.wins}</td>
        <td>${stat.finalKills}</td>
        <td>${stat.fkdr}</td>
      `;
    } else {
      // 新增行
      const newRow = document.createElement("tr");
      newRow.innerHTML = `
        <td>${stat.username}</td>
        <td>${stat.wins}</td>
        <td>${stat.finalKills}</td>
        <td>${stat.fkdr}</td>
      `;
      tableBody.appendChild(newRow);
    }
  });
}

内容的提问来源于stack exchange,提问作者user20771125

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:50:15