Node.js中实现对象转换为按部门、类型分组的三维结构方案
打卡数据结构转换实现方案
核心实现逻辑
- 先定义时间格式化工具函数,将原始时间戳/日期对象转换为
YYYY-MM-DD HH:mm:ss格式的标准时间字符串 - 初始化结果结构,外层包含
onfield字段,先按对象结构存储方便按部门key分组,若需要数组格式可后续转换 - 遍历原始打卡数据,每条数据先做字段格式化处理:
- 格式化
checkin、checkout字段 - 判断
checkout是否为空,为空则将hours设置为NoCheckOut,否则保留原始工作时长
- 格式化
- 按「部门→type」二级分组,将格式化后的记录推入对应分组的数组中
完整实现代码
// 时间格式化工具函数,支持传入Date对象、时间戳、可被Date解析的字符串 function formatDate(dateInput) { if (!dateInput) return '' const date = new Date(dateInput) const year = date.getFullYear() const month = String(date.getMonth() + 1).padStart(2, '0') const day = String(date.getDate()).padStart(2, '0') const hour = String(date.getHours()).padStart(2, '0') const minute = String(date.getMinutes()).padStart(2, '0') const second = String(date.getSeconds()).padStart(2, '0') return `${year}-${month}-${day} ${hour}:${minute}:${second}` } // 数据转换主函数 function transformCheckinData(rawData) { // 初始化结果结构 const result = { onfield: {} } rawData.forEach(item => { // 1. 格式化当前记录的时间字段 const formattedCheckin = formatDate(item.checkin) const formattedCheckout = formatDate(item.checkout) // 2. 处理hours字段 const hours = formattedCheckout ? item['工作时长'] : 'NoCheckOut' // 3. 构造格式化后的记录项,可根据需要调整保留字段 const formattedItem = { id: item.id, badge_id: item.badge_id, 姓名: item.姓名, 性别: item.性别, type: item.type, 部门: item.部门, checkin: formattedCheckin, checkout: formattedCheckout, hours: hours } // 4. 二级分组逻辑 const dept = item.部门 const type = item.type // 若部门不存在则初始化部门对象 if (!result.onfield[dept]) { result.onfield[dept] = {} } // 若部门下对应type不存在则初始化数组 if (!result.onfield[dept][type]) { result.onfield[dept][type] = [] } // 推入当前记录 result.onfield[dept][type].push(formattedItem) }) // 若需求要求onfield为数组结构,可解开下方注释完成转换 // result.onfield = Object.entries(result.onfield).map(([deptName, typeGroups]) => { // return { // 部门名称: deptName, // type分组: typeGroups // } // }) return result } // 调用示例 const rawData = [ {id:1, badge_id:'A001', 姓名:'张三', 性别:'男', type:'PM', 部门:'技术部', checkin:1716166800000, checkout:1716199200000, '工作时长':'9'}, {id:2, badge_id:'A002', 姓名:'李四', 性别:'女', type:'PF', 部门:'技术部', checkin:1716167400000, checkout:null, '工作时长':'0'}, {id:3, badge_id:'B001', 姓名:'王五', 性别:'男', type:'OM', 部门:'市场部', checkin:1716166200000, checkout:1716198600000, '工作时长':'9'} ] console.log(transformCheckinData(rawData))
结果说明
执行代码后输出结构完全匹配需求:
- 按部门为一级key、type为二级key分层,每个type对应同组的格式化打卡记录数组
- 时间字段统一为
YYYY-MM-DD HH:mm:ss标准格式 - 无签出记录的项
hours自动设置为NoCheckOut - 若需要onfield为数组结构,解开代码中对应注释即可完成转换
内容的提问来源于stack exchange,提问作者Akash G
相关产品推荐
相关产品推荐

