【问题标题】:Array of Date with for loop带有 for 循环的日期数组
【发布时间】: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;
}
【问题讨论】:
标签:
javascript
arrays
date
for-loop
typescript
【解决方案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]);
}