for循环的数组

时间:2016-09-09 07:45:34

标签: javascript arrays date for-loop typescript

我的代码有问题。如果我在for循环中打印daysArray项(console.log(daysArray [i]);)它返回正确的日期,但是在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;
}

2 个答案:

答案 0 :(得分:2)

问题是你总是使用相同的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

这会创建一个template<typename ...U> void foo(const char *format, U... bars); 的新实例,它是前一个实例的“克隆”。

答案 1 :(得分:0)

您的问题很容易解决。您只是在数组的每个位置复制相同的项目。这意味着您将覆盖在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]);
}