带有 for 循环的日期数组

Posted

技术标签:

【中文标题】带有 for 循环的日期数组【英文标题】:Array of Date with for loop 【发布时间】:2017-01-17 07:10:17 【问题描述】:

我对这段代码有疑问。如果我在 for 循环 (console.log(daysArray[i]);) 中打印 daysArray 项目,它将返回正确的日期,但在 for 循环之后返回所有 daysArray 项目的最后日期。 请一些可以帮助我的人。

public getFullMonth(date: Date): Array<Date> 
    var firstDay = this.getSunday(date);
    var daysArray: Array<Date> = Array<Date>();

    for (var i = 0; i < 43; i++) 
        firstDay.setDate(firstDay.getDate() + 1);
        daysArray[i] = firstDay;
        console.log(daysArray[i]);
    

    console.log(daysArray.length);
    console.log(daysArray[0]);
    console.log(daysArray[30]);
    return daysArray;

【问题讨论】:

你到底想要什么?你能为此分享小提琴吗? 你能分享你的日期值数组吗? 【参考方案1】:

问题是你总是使用Date 的同一个实例,你永远不会创建一个新实例,所以daysArray 中的所有项目都是同一个实例。

因此,当你这样做时:

firstDay.setDate(firstDay.getDate() + 1);

然后您实际上更改了所有项目的值。 您应该为每个项目创建一个新实例:

public getFullMonth(date: Date): Array<Date> 
    var firstDay = this.getSunday(date);
    var daysArray: Array<Date> = Array<Date>();

    for (var i = 0; i < 43; i++) 
        firstDay = new Date(firstDay.getTime());
        firstDay.setDate(firstDay.getDate() + 1);
        daysArray[i] = firstDay;
        console.log(daysArray[i]);
    

    console.log(daysArray.length);
    console.log(daysArray[0]);
    console.log(daysArray[30]);
    return daysArray;

请注意,现在每次迭代都会:

firstDay = new Date(firstDay.getTime());

这会创建一个 Date 的新实例,它是前一个实例的“克隆”。

【讨论】:

【参考方案2】:

您的问题很容易解决。您只是在数组的每个位置复制相同的项目。这意味着您将覆盖您在 for 循环的每个步骤中设置的值。

只需为数组的每个位置创建一个新对象,就不会再出现错误了。像这样的

for (var i =0; i < 43; i++) 
  var nDay = new Date();
  nDay.setDate(firstDay.getDate() + i + 1);
  daysArray[i] = nDay;
  console.log(daysArray[i]);

【讨论】:

以上是关于带有 for 循环的日期数组的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2 for 循环低和高日期之间

Swift - 使用 for 循环将数据添加到核心数据

带有日期的循环的 Excel VBA 脚本

带有日期循环的 SQL [关闭]

变量作为for循环中的日期[重复]

v-for 按日期分组渲染项目