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

如何转换玩家出勤JSON结构 适配json2xls单行多列导出需求

问题背景

我正在尝试使用json2xls将记录玩家出勤情况的JSON数据转换为Excel文件。目前该工具默认将每一条JSON条目生成为创建后Excel文件中的单独一行,但我想要实现的效果是:每名玩家仅对应Excel中的1行数据,该玩家的各次时间点出勤记录将转换为该行下的新增列。

原始JSON数据结构如下:

[
  {
    username: 'player1',
    nickname: 'Player One',
    capturetime: '23:4',
    ismuted: false,
    isdeafened: false,
    ispresent: true,
  },
  {
    username: 'player1',
    nickname: 'Player One',
    capturetime: '23:5',
    ismuted: false,
    isdeafened: false,
    ispresent: false,
  },
  {
    username: 'player1',
    nickname: 'Player One',
    capturetime: '23:31',
    ismuted: false,
    isdeafened: false,
    ispresent: false,
  },
  {
    username: 'player1',
    nickname: 'Player One',
    capturetime: '7:27',
    ismuted: false,
    isdeafened: false,
    ispresent: false,
  }
]

要实现预期导出效果,需要先将原始JSON转换为单用户单行、每次出勤记录追加为带序号新列的结构,目标结构示例如下:

[{
  username: 'player1',
  nickname: 'Player One',
  capturetime1: '23:4',
  ispresent1: true,
  ismuted1: false,
  isdeafened1: false,
  capturetime2: '23:5',
  ispresent2: false,
  ismuted2: false,
  isdeafened2: false,
  capturetime3: '23:31',
  ispresent3: false,
  ismuted3: false,
  isdeafened3: false,
  capturetime4: '7:27',
  ispresent4: false,
  ismuted4: false,
  isdeafened4: false
}]
实现方案

转换逻辑分两步完成:

  • 第一步:以username作为用户唯一标识对原始数据分组,把同一玩家的所有出勤记录归集到同一个分组下,保留固定不变的username、nickname基础字段
  • 第二步:遍历每个玩家分组下的出勤记录,按记录顺序给动态出勤字段(capturetime/ismuted/isdeafened/ispresent)加从1开始的数字后缀,平铺到玩家的根对象上,最终输出的数组即可直接传入json2xls生成符合要求的Excel。

可直接复用的转换代码如下:

function transformAttendance(rawData) {
  // 按用户名做分组聚合
  const userGroup = {};
  for (const item of rawData) {
    const uid = item.username;
    if (!userGroup[uid]) {
      userGroup[uid] = {
        username: item.username,
        nickname: item.nickname,
        attendanceRecords: []
      };
    }
    // 存入单条出勤记录
    userGroup[uid].attendanceRecords.push({
      capturetime: item.capturetime,
      ismuted: item.ismuted,
      isdeafened: item.isdeafened,
      ispresent: item.ispresent
    });
  }

  // 平铺为带序号字段的结构
  return Object.values(userGroup).map(user => {
    const row = {
      username: user.username,
      nickname: user.nickname
    };
    user.attendanceRecords.forEach((record, idx) => {
      const suffix = idx + 1;
      row[`capturetime${suffix}`] = record.capturetime;
      row[`ismuted${suffix}`] = record.ismuted;
      row[`isdeafened${suffix}`] = record.isdeafened;
      row[`ispresent${suffix}`] = record.ispresent;
    });
    return row;
  });
}

// 调用示例
const convertedData = transformAttendance(/* 传入原始JSON数据 */);
// 后续直接将convertedData传入json2xls即可

如果存在多玩家、且不同玩家出勤次数不一致的场景,可以先统计所有玩家的最大出勤次数,对出勤次数不足的玩家补全对应空值字段,保证导出的Excel所有行的列数对齐。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:48:21