如何转换玩家出勤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
相关产品推荐
相关产品推荐

