for循环替换数组中的所有先前项目
for loop replacing all previous items in array
我正在尝试根据周数组创建一系列日期。
有四个星期,每个星期有 5 天,每个星期是一个包含周数和 5 天数组的对象 - 天数是包含星期几和日期的对象。
例如,weeks[0].days[0].day
会 return 星期一。
我使用 LuxonJS 使用函数 generateDate(weekNr, dayNr)
.
根据周数和星期几生成日期
为了在工作日项中填充 date
值,我尝试了以下方法:
for(x = 0; x <= weeks.length; x++){
for(y = 0; y <= weeks[x].days.length; y++){
weeks[x].days[y]['date'] = generateDate(weeks[x].weekNr, y)
}
}
但是,出于某种原因,现在每周的日子都用上周的日期填充,因此 weeks[0].days[4].date
将 return 与 weeks[3].days[4].date
完全相同的日期。换句话说 - 除了周数,4 周变得相同。
如果我在 for 循环中记录日期,它们都会正确显示,因此似乎每次重复第一个 for 循环时它们都会被替换。有谁知道我做错了什么?
此行为可能与您构建原始 weeks
数组的方式有关。看起来您将 same 对象分配给 weeks
中的所有四个条目,而不是为每个条目创建一个 new 对象。
然后当您 运行 那个嵌套循环时,您将为外循环的每次迭代改变 相同的 对象。因此,每次将对象分配(或推送)到 weeks
数组时,请确保创建一个新对象。
附带说明一下,这是我在原版中的做法 JavaScript:
function getWeekDays(year, weekNr) {
let dt = new Date(year, 0, 4); // 4 January is always in week #1
// Get Sunday before the start of the week
dt.setDate(dt.getDate() - (dt.getDay() || 7) - 7 + weekNr * 7);
return {
weekNr,
days: Array.from({length: 5}, () => {
dt.setDate(dt.getDate() + 1); // Increment date
return {
day: dt.toLocaleDateString("en", { weekday: 'long'}),
date: dt.toLocaleDateString("en-SE")
};
})
};
}
function getMonthDays(year, firstWeek, numWeeks) {
return Array.from({length: numWeeks}, () => getWeekDays(year, firstWeek++));
}
// Example creation of the weeks array
let weeks = getMonthDays(2022, 9, 4);
console.log(weeks);
我正在尝试根据周数组创建一系列日期。
有四个星期,每个星期有 5 天,每个星期是一个包含周数和 5 天数组的对象 - 天数是包含星期几和日期的对象。
例如,weeks[0].days[0].day
会 return 星期一。
我使用 LuxonJS 使用函数 generateDate(weekNr, dayNr)
.
为了在工作日项中填充 date
值,我尝试了以下方法:
for(x = 0; x <= weeks.length; x++){
for(y = 0; y <= weeks[x].days.length; y++){
weeks[x].days[y]['date'] = generateDate(weeks[x].weekNr, y)
}
}
但是,出于某种原因,现在每周的日子都用上周的日期填充,因此 weeks[0].days[4].date
将 return 与 weeks[3].days[4].date
完全相同的日期。换句话说 - 除了周数,4 周变得相同。
如果我在 for 循环中记录日期,它们都会正确显示,因此似乎每次重复第一个 for 循环时它们都会被替换。有谁知道我做错了什么?
此行为可能与您构建原始 weeks
数组的方式有关。看起来您将 same 对象分配给 weeks
中的所有四个条目,而不是为每个条目创建一个 new 对象。
然后当您 运行 那个嵌套循环时,您将为外循环的每次迭代改变 相同的 对象。因此,每次将对象分配(或推送)到 weeks
数组时,请确保创建一个新对象。
附带说明一下,这是我在原版中的做法 JavaScript:
function getWeekDays(year, weekNr) {
let dt = new Date(year, 0, 4); // 4 January is always in week #1
// Get Sunday before the start of the week
dt.setDate(dt.getDate() - (dt.getDay() || 7) - 7 + weekNr * 7);
return {
weekNr,
days: Array.from({length: 5}, () => {
dt.setDate(dt.getDate() + 1); // Increment date
return {
day: dt.toLocaleDateString("en", { weekday: 'long'}),
date: dt.toLocaleDateString("en-SE")
};
})
};
}
function getMonthDays(year, firstWeek, numWeeks) {
return Array.from({length: numWeeks}, () => getWeekDays(year, firstWeek++));
}
// Example creation of the weeks array
let weeks = getMonthDays(2022, 9, 4);
console.log(weeks);