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

基于二维数组生成员工替班报告的JavaScript实现问题

员工替班报告生成方案

原代码存在的问题

  • 未定义schedule变量,运行会直接报错
  • 仅收集了替班人信息,但未关联对应的日期,也没有处理连续日期合并的逻辑,完全无法生成预期格式的报告

解决思路

要生成目标格式的替班报告,需完成以下核心步骤:

  1. 解析表头中的日期字符串,提取出日期(如24)和月份缩写(如Jan)
  2. 按员工分组,记录每个员工需要替班的日期及对应替班人
  3. 将同一替班人对应的日期整理为「单个日期/连续日期范围」的格式
  4. 拼接成指定格式的报告条目并输出

完整实现代码

function display() {
  const values = [
    ["Name/Date", "2023-01-22T18:30:00.000Z", "2023-01-23T18:30:00.000Z", "2023-01-24T18:30:00.000Z", "2023-01-25T18:30:00.000Z", "2023-01-26T18:30:00.000Z"],
    ["Name#1", "", "Name#2", "", "Name#2", ""],
    ["Name#2", "", "", "", "", ""],
    ["Name#3", "", "", "", "", ""],
    ["Name#4", "", "", "", "", ""],
    ["Name#5", "Name#4", "Name#4", "Name#4", "Name#4", "Name#4"],
    ["Name#6", "Name#3", "", "Name#3", "Name#3", "Name#3"]
  ];

  // 处理表头日期:提取日和月份缩写
  const dateInfo = values[0].slice(1).map(dateStr => {
    const date = new Date(dateStr);
    return {
      day: date.getDate(),
      month: date.toLocaleString('en-US', { month: 'short' })
    };
  });
  const month = dateInfo[0].month; // 所有日期为同一月份,直接复用

  // 遍历每个员工行(跳过表头)
  for (let i = 1; i < values.length; i++) {
    const employeeName = values[i][0];
    // 按替班人分组存储日期
    const swapRecords = {};

    for (let j = 1; j < values[i].length; j++) {
      const swapPerson = values[i][j];
      if (!swapPerson) continue; // 跳过无替班的日期

      const day = dateInfo[j - 1].day;
      // 初始化替班人对应的日期数组
      if (!swapRecords[swapPerson]) {
        swapRecords[swapPerson] = [];
      }
      swapRecords[swapPerson].push(day);
    }

    // 为每个替班人整理日期格式并输出
    for (const [swapPerson, days] of Object.entries(swapRecords)) {
      // 日期排序,方便合并连续区间
      const sortedDays = [...days].sort((a, b) => a - b);
      const dateSegments = [];
      let start = sortedDays[0];
      let end = sortedDays[0];

      // 合并连续日期
      for (let k = 1; k < sortedDays.length; k++) {
        if (sortedDays[k] === end + 1) {
          end = sortedDays[k];
        } else {
          dateSegments.push(start === end ? `${start}` : `${start} - ${end}`);
          start = sortedDays[k];
          end = sortedDays[k];
        }
      }
      // 添加最后一个日期段
      dateSegments.push(start === end ? `${start}` : `${start} - ${end}`);

      // 生成并打印最终格式的报告条目
      const result = `${employeeName}: ${dateSegments.join(', ')} ${month} ----> ${swapPerson}`;
      console.log(result);
    }
  }
}

// 执行函数生成报告
display();

代码逻辑说明

  1. 日期处理:将表头的ISO日期字符串转换为日期对象,提取日期和月份缩写,统一复用月份(因为所有日期属于同一月份)
  2. 替班记录分组:遍历每个员工的日期列,用对象按替班人分组存储对应的替班日期
  3. 连续日期合并:对每个替班人的日期数组排序后,遍历合并连续日期,将连续日期转为「起始-结束」的格式
  4. 格式输出:将员工名、整理后的日期、月份、替班人拼接成指定格式的字符串并打印

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:55:16