基于二维数组生成员工替班报告的JavaScript实现问题
员工替班报告生成方案
原代码存在的问题
- 未定义
schedule变量,运行会直接报错 - 仅收集了替班人信息,但未关联对应的日期,也没有处理连续日期合并的逻辑,完全无法生成预期格式的报告
解决思路
要生成目标格式的替班报告,需完成以下核心步骤:
- 解析表头中的日期字符串,提取出日期(如24)和月份缩写(如Jan)
- 按员工分组,记录每个员工需要替班的日期及对应替班人
- 将同一替班人对应的日期整理为「单个日期/连续日期范围」的格式
- 拼接成指定格式的报告条目并输出
完整实现代码
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();
代码逻辑说明
- 日期处理:将表头的ISO日期字符串转换为日期对象,提取日期和月份缩写,统一复用月份(因为所有日期属于同一月份)
- 替班记录分组:遍历每个员工的日期列,用对象按替班人分组存储对应的替班日期
- 连续日期合并:对每个替班人的日期数组排序后,遍历合并连续日期,将连续日期转为「起始-结束」的格式
- 格式输出:将员工名、整理后的日期、月份、替班人拼接成指定格式的字符串并打印
内容的提问来源于stack exchange,提问作者Code Guy
相关产品推荐
相关产品推荐

