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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:18:03