我想使用My代码创建的代码是an array of 7 objects,如下所示:

(7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]

objects是7,因为它们表示一周中的每一天,如下所示,当7对象的数组展开时:

(7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]
  0: {Sundays: Array(6)}
  1: {Mondays: Array(6)}
  2: {Tuesdays: Array(6)}
  3: {Wednesdays: Array(6)}
  4: {Thursdays: Array(6)}
  5: {Fridays: Array(6)}
  6: {Saturdays: Array(6)}

我把每一天分成6 time ranges天,即:

00:00 - 04:00,
04:00 - 08:00,
08:00 - 12:00,
12:00 - 16:00,
16:00 - 20:00 and finally
20:00 - 00:00.

...并将time ranges分分配给每一天.时间以timestamp格式保存.

为了清楚起见,我随机 Select 扩展Mondays个对象,以说明我的意思:

(7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]
  0: {Sundays: Array(6)}
  1: Mondays: Array(6)
       0: {T_00:00_Start: 1702242000, T_04:00_End: 1702256400}
       1: {T_04:00_Start: 1702256400, T_08:00_End: 1702270800}
       2: {T_08:00_Start: 1702270800, T_12:00_End: 1702285200}
       3: {T_12:00_Start: 1702285200, T_16:00_End: 1702299600}
       4: {T_16:00_Start: 1702299600, T_20:00_End: 1702314000}
       5: {T_20:00_Start: 1702314000, T_00:00_End: 1702328400}
  .
  .
  .  

以下体系 struct 表明,7天(一周)的持续时间已添加到天数组中:

(7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]
  0: {Sundays: Array(6)}
  1: {Mondays: Array(6)}
  2: {Tuesdays: Array(6)}
  3: {Wednesdays: Array(6)}
  4: {Thursdays: Array(6)}
  5: {Fridays: Array(6)}
  6: {Saturdays: Array(6)}

但是,如果今天是星期一,而持续时间是8天,则对象数组将如下所示(请注意,星期一现在包含的数组为12,而不是6):

(7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]
  0: {Sundays: Array(6)}
  1: {Mondays: Array(12)}
  2: {Tuesdays: Array(6)}
  3: {Wednesdays: Array(6)}
  4: {Thursdays: Array(6)}
  5: {Fridays: Array(6)}
  6: {Saturdays: Array(6)}

如果我把这Mondays个物体展开,它会显示出12个物体.第一个6代表今天(本周一),而下一个6代表下一周的星期一,如下所示:

(7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]
  0: {Sundays: Array(6)}
  1: Mondays: Array(12)

       // Today (Current Monday)
       0: {T_00:00_Start: 1702242000, T_04:00_End: 1702256400}
       1: {T_04:00_Start: 1702256400, T_08:00_End: 1702270800}
       2: {T_08:00_Start: 1702270800, T_12:00_End: 1702285200}
       3: {T_12:00_Start: 1702285200, T_16:00_End: 1702299600}
       4: {T_16:00_Start: 1702299600, T_20:00_End: 1702314000}
       5: {T_20:00_Start: 1702314000, T_00:00_End: 1702328400}

       // Monday the following week
       6: {T_00:00_Start: 1702846800, T_04:00_End: 1702861200}
       7: {T_04:00_Start: 1702861200, T_08:00_End: 1702875600}
       8: {T_08:00_Start: 1702875600, T_12:00_End: 1702890000}
       9: {T_12:00_Start: 1702890000, T_16:00_End: 1702904400}
       10: {T_16:00_Start: 1702904400, T_20:00_End: 1702918800}
       11: {T_20:00_Start: 1702918800, T_00:00_End: 1702933200}
  .
  .
  .  

如果今天又是Monday,duration14,意味着2 weeks,那么 struct 应该是这样的:

(7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]
  0: {Sundays: Array(12)}
  1: {Mondays: Array(12)}
  2: {Tuesdays: Array(12)}
  3: {Wednesdays: Array(12)}
  4: {Thursdays: Array(12)}
  5: {Fridays: Array(12)}
  6: {Saturdays: Array(12)}

为什么我无法获得下面的代码来实现这一点?

我的代码失败是因为,如果您使用"8天"的持续时间,存储在每一天下的时间范围数组将显示超过"42个数组".

(7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]
   0: {Sundays: Array(42)}
   1: {Mondays: Array(84)}
   2: {Tuesdays: Array(42)}
   3: {Wednesdays: Array(42)}
   4: {Thursdays: Array(42)}
   5: {Fridays: Array(42)}
   6: {Saturdays: Array(42)}

持续"8天"的期望输出应为:

(7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]
   0: {Sundays: Array(6)}
   1: {Mondays: Array(12)}
   2: {Tuesdays: Array(6)}
   3: {Wednesdays: Array(6)}
   4: {Thursdays: Array(6)}
   5: {Fridays: Array(6)}
   6: {Saturdays: Array(6)}

另一个例子是,以"14天或一周"为期限,期望的输出应为:

(7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]
   0: {Sundays: Array(12)}
   1: {Mondays: Array(12)}
   2: {Tuesdays: Array(12)}
   3: {Wednesdays: Array(12)}
   4: {Thursdays: Array(12)}
   5: {Fridays: Array(12)}
   6: {Saturdays: Array(12)}

此外,存储在这些日期下的时间戳中的时间范围应该相对于父日期,我的代码无法实现这一点.

例如,请注意存储在星期四下的时间戳实际上都不表示星期四.

Thursdays: Array(42)
    0: {T_00:00_Start: 1702242000, T_04:00_End: 1702256400}
    1: {T_04:00_Start: 1702256400, T_08:00_End: 1702270800}
    2: {T_08:00_Start: 1702270800, T_12:00_End: 1702285200}
    3: {T_12:00_Start: 1702285200, T_16:00_End: 1702299600}
    4: {T_16:00_Start: 1702299600, T_20:00_End: 1702314000}
    5: {T_20:00_Start: 1702314000, T_00:00_End: 1702328400}

以下是我的代码,您可以在浏览器控制台中复制、粘贴和运行它们.

我的代码中的持续时间变量指的是durationOfCampaignInDays:

const daysArrayDummy = ['Sundays', 'Mondays', 'Tuesdays', 'Wednesdays', 'Thursdays', 

    'Fridays', 'Saturdays'];
    
    const startOfTheDay = moment().startOf("day");
    
    const durationOfCampaignInDays = 8; // Replace with your actual variable
    const updatedDaysArray = [];
    
    for (let i = 0; i < daysArrayDummy.length; i++) {
      const day = daysArrayDummy[i];
      console.log(`Processing ${day}`);
      const dailyTimeRanges = [];
    
      const isSpecialDay = i === 1; // Adjust the condition based on the special days
      const numberOfTimeRanges = isSpecialDay ? 12 : 6; // Adjust the number of time ranges
    
      for (let j = 0; j < durationOfCampaignInDays; j++) {
        const dayStart = moment(startOfTheDay).add(j, 'days').startOf("day");
    
        for (let k = 0; k < numberOfTimeRanges; k++) {
          const rangeStart = moment(dayStart).add(k * 4, 'hours');
          const rangeEnd = moment(dayStart).add((k + 1) * 4, 'hours');
    
          const startTimestamp = Math.floor(rangeStart.valueOf() / 1000);
          const endTimestamp = Math.floor(rangeEnd.valueOf() / 1000);
    
          const timestampKey = `${moment(rangeStart).format('T_HH:mm')}_Start`;
    
          dailyTimeRanges.push({
            [timestampKey]: startTimestamp,
            [`${moment(rangeEnd).format('T_HH:mm')}_End`]: endTimestamp,
          });
        }
      }
    
      updatedDaysArray.push({ [day]: dailyTimeRanges });
    }
    
    // Log the updated daysArray
    console.log('Updated daysArray: ', updatedDaysArray);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.4/moment.min.js"></script>

推荐答案

在您的代码中,您具有以下 struct

 for (let i = 0; i < daysArrayDummy.length; i++) {
 ...
   for (let j = 0; j < durationOfCampaignInDays; j++) {
   ...
     for (let k = 0; k < numberOfTimeRanges; k++) {
       ...
       dailyTimeRanges.push(...);
     }
   }
   updatedDaysArray.push({ [day]: dailyTimeRanges });
 }

在最外层的循环中,您在工作日(星期日)进行了搜索.星期六).在下一个级别中,您将在整个活动期间(即8,14或任何天数)进行游戏.在最里面的循环中,你在一天之内完成了整个范围.

因此,对于每个工作日(例如,周日),您将在您的活动持续时间内为every day人创建每日范围,无论该天是否真的是周日

如何解决这个问题?

首先,我认为您想要的数据 struct 似乎有点奇怪.您需要一个数组,其中每个元素只有一个属性,每个属性的名称都不同,每个属性都包含一个范围array.更直观的数据 struct 如下所示

{
   Sundays: [...],
   Mondays: [...]
   ...
}

但这不是我该做的决定.

最简单的解决方案可能是判断您当前在内部循环中查看的日期是否真的与您在外部循环中查看的工作日相同,如果不是,则跳过它.

for (let j = 0; j < durationOfCampaignInDays; j++) {
  const dayStart = moment(startOfTheDay).add(j, 'days').startOf("day");
  const weekday = dayStart.day(); // gives you the weekday as number, 0 = sun, 1 = mon, ...

  //if the weekday of the current day isn't the same as the weekday
  //in the outer loop, skip generating ranges
  if (weekday != i) continue;

  ...
}

更有效的解决方案,以获得您想要的结果可能是

  1. go 掉最外层的循环
  2. 在活动长度的循环中,判断当前日期实际是哪一天,并使用这一点来确定应该将生成的时间范围添加到哪一天

类似这样的东西

//initialize the result with all weekdays and empty ranges array
let weekdays = ["Sundays","Mondays", ..., "Saturdays"];
let updatedDaysArray = weekdays.map(x => { [x]: [] });
for (let j = 0; j < durationOfCampaignInDays; j++) {
  const 
    dayStart = moment(startOfTheDay).add(j, 'days').startOf("day"),
    weekday = dayStart.day(),  //gets the weekday 0 = sun, 1 = mon, ...
    weekdayname = weekdays[weekday];

  //retrieve the existing array of ranges from the result
  //and add the new ranges for that day to that array
  let dailyTimeRanges = updatedDaysArray[weekday][weekdayname];
  for (let k = 0; k < numberOfTimeRanges; k++) {
    ...
    dailyTimeRanges.push(...);
  }

}

对于更直观的数据 struct ,我建议

//initialize the result with all weekdays and empty ranges array
let weekdays = ["Sundays","Mondays", ..., "Saturdays"];
let result = Object.fromEntries(weekdays.map(x => [x, []));
for (let j = 0; j < durationOfCampaignInDays; j++) {
  const 
    dayStart = moment(startOfTheDay).add(j, 'days').startOf("day"),
    weekday = dayStart.day(),  //gets the weekday 0 = sun, 1 = mon, ...
    weekdayname = weekdays[weekday];

  ...
  //retrieve the existing array of ranges from the result
  //and add the new ranges for that day to that array
  let dailyTimeRanges = result[weekdayname];
  for (let k = 0; k < numberOfTimeRanges; k++) {
    ...
    dailyTimeRanges.push(...);
  }

}

Javascript相关问答推荐

为什么JavaScript双边字符串文字插值不是二次的?

可以的.是否可以在不预编译的情况下使用嵌套 Select 器?

网页自检测外部元素无法加载

colored颜色 检测JS,平均图像 colored颜色 检测JS

Mongoose post hook在使用await保存时不返回Postman响应

CheckBox作为Vue3中的一个组件

当Redux提供程序访问Reduxstore 时,可以安全地从Redux提供程序外部调用钩子?

Puppeteer上每页的useProxy返回的不是函数/构造函数

以编程方式聚焦的链接将被聚焦,但样式不适用

在SHINY R中的嵌套模块中,不能使用Java代码

触发异步函数后不能显示数据

如何在AG-Grid文本字段中创建占位符

有没有办法通过使用不同数组中的值进行排序

用Reaction-RT-Chart创建实时条形图

如何使用Cypress在IFRAME中打字

是否有静态版本的`instanceof`?

如何创建一个for循环,用于计算仪器刻度长度并将其放入一个HTML表中?

如何使用useparams从react路由中提取id

检测带有委托的元素内部的点击,以及元素何时按其类名被选中

如何动态呈现适合未知屏幕大小的最大数量的表行?苗条的