我想使用我的代码创建的是
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>
在您的代码中有以下结构
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: [...]
...
}
但这不是我的决定。
获得所需结果的最简单解决方案可能是
我是这样的
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(...);
}
}