JavaScript数组生成问题:按工作日/周末规则填充(适配任意起始日)
优化方案:基于起始日期动态生成工作日/周末数组
你的核心问题在于原代码用固定模运算判断周末,这种方式仅适配起始日为周一的场景。正确的思路应该是从起始日期开始,逐个计算每一天的星期几,再决定填充数值还是空值——这样不管起始日是周几,都能精准匹配工作日和周末。
修复后的完整代码
var first = [, 500.0, 16.0, "Fri Jun 08 00:00:00 GMT-04:00 2018", 2.0, 24.0, "Sun Jun 03 00:00:00 GMT-04:00 2018", 0.0, "Tue Jun 19 00:00:00 GMT-04:00 2018"]; var second = [, 1200.0, 25.0, "Sun Jun 10 00:00:00 GMT-04:00 2018", 6.0, 17.0, "Fri May 25 00:00:00 GMT-04:00 2018", 5.0, "Wed Jul 18 00:00:00 GMT-04:00 2018"]; console.log('NOTE: day of week index - 6 = saturday, 0=Sunday, 1=mon, 2=tue, 3=wed, 4=thu, 5=fri'); console.log('-------------------------------------------'); var result1 = cleanArray(first); console.log('result1 expected result = ,42,42,42,42,42,,,42,42,42,42,42,,,42'); console.log('day of week for result1 = ' + first[7]) console.log('result1= ' + result1); var result2 = cleanArray(second); console.log('result2 expected result = 31,,,31,31,31,31,31,,,31,31,31,31,31,,,31,31,31,31,31,,,31'); console.log('day of week for result2 = ' + second[7]) console.log('result2= ' + result2); // 计算两个日期之间的工作日数(保留原函数) function getBusinessDays(startDate, endDate) { var count = 0; var curDate = new Date(startDate); while (curDate <= new Date(endDate)) { var dayOfWeek = curDate.getDay(); if(!((dayOfWeek == 6) || (dayOfWeek == 0))) count++; curDate.setDate(curDate.getDate() + 1); } return count; } // 优化后的cleanArray函数 function cleanArray(ed){ var newCleanArr = []; var numWorkingDays = getBusinessDays(ed[6], ed[8]); var dailyCF = Math.round(ed[1]/numWorkingDays); // 把起始日期转成Date对象,用于逐天递增 var currentDate = new Date(ed[6]); // 遍历总天数(ed[2]是installDays) for (var i = 0; i < ed[2]; i++) { var dayOfWeek = currentDate.getDay(); // 判断是否为周末:0=周日,6=周六 if (dayOfWeek === 0 || dayOfWeek === 6) { newCleanArr.push(""); } else { newCleanArr.push(dailyCF); } // 日期加1,进入下一天 currentDate.setDate(currentDate.getDate() + 1); } return newCleanArr; }
关键优化点说明
- 动态判断每一天的星期几:不再依赖模运算的固定规则,而是直接基于当前日期的
getDay()结果判断,完全适配任意起始日的场景。 - 逐天递增日期:从起始日期开始,每遍历一次就把日期加1,确保每一步判断的都是对应位置的真实日期。
- 逻辑简洁清晰:去掉了原代码中复杂且不准确的多条件判断,用最直接的周末判断逻辑替代,可读性和可维护性大幅提升。
比如你提到的起始日为周五的场景:假设总天数是5天,起始日周五(getDay()=5),那么遍历的5天依次是周五(工作日)、周六(空)、周日(空)、周一(工作日)、周二(工作日),最终数组就是[22,,,22,22],完全符合需求。
内容的提问来源于stack exchange,提问作者J nui
相关产品推荐
相关产品推荐

