如何为一周中的每一天分配数组时间范围?

问题描述 投票:0回答:1

我想使用我的代码创建的是

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
格式保存。

为了清楚起见,我随机选择展开

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

以下架构建议将 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
并且
duration
14
意思是
2 weeks
,那么结构预计将如下所示:

(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)}

为什么我无法通过下面的代码来实现此目的?

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

我的代码中的持续时间变量被称为

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>

arrays multidimensional-array momentjs javascript-objects unix-timestamp
1个回答
0
投票

在您的代码中有以下结构

 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 或任意天数)。在最里面的循环中,您在一天内迭代范围。

因此,对于每个工作日(例如星期日),您都将在活动持续时间内为每一天创建 dailyRanges,无论那天是否真的是星期日

如何解决这个问题?

首先,我认为你想要的数据结构似乎有点奇怪。您需要一个数组,其中每个元素仅具有一个属性,每个元素包含一个范围数组,该属性的名称不同。更直观的数据结构如下所示

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

但这不是我的决定。

获得所需结果的最简单解决方案可能是

  1. 去掉最外层的循环
  2. 在露营期间的循环中,检查当前日期实际是哪一天,并使用它来确定应将生成的时间范围添加到哪一天

我是这样的

let updatedDaysArray = [];
let weekdays = ["Sundays","Mondays", ..., "Saturdays"];
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];

  //check if you already generated ranges for that day
  //if not create a new object with an empty range array and add it to the result
  if (!updatedDaysArray[weekday]) {
    updatedDaysArray[weekday] = {[weekdayname ]: []};
  }

  //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(...);
  }

}
© www.soinside.com 2019 - 2024. All rights reserved.