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

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;
}

关键优化点说明

  1. 动态判断每一天的星期几:不再依赖模运算的固定规则,而是直接基于当前日期的getDay()结果判断,完全适配任意起始日的场景。
  2. 逐天递增日期:从起始日期开始,每遍历一次就把日期加1,确保每一步判断的都是对应位置的真实日期。
  3. 逻辑简洁清晰:去掉了原代码中复杂且不准确的多条件判断,用最直接的周末判断逻辑替代,可读性和可维护性大幅提升。

比如你提到的起始日为周五的场景:假设总天数是5天,起始日周五(getDay()=5),那么遍历的5天依次是周五(工作日)、周六(空)、周日(空)、周一(工作日)、周二(工作日),最终数组就是[22,,,22,22],完全符合需求。

内容的提问来源于stack exchange,提问作者J nui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:53:18