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