我正在尝试使用日期列表填充数组。
当我回去检索数组中的日期时,它们都是相同的日期。
var paydates = new Array();
var i;
var firstDate = new Date();
firstDate.setFullYear(2010, 11, 26); //set the first day in our array as 12/26/10
for (i=0; i < 200; i++) //put 200 dates in our array
{
paydates[i] = firstDate;
firstDate.setDate(firstDate.getDate()+14); //add 14 days
document.write("1st: " + i + ":" + paydates[i] + "<br />");
//this lists the dates correctly
}
//when I go back to retrieve them:
for (i=0; i < 200; i++)
{
document.write("2nd: " + i + ":" + paydates[i] + "<br />");
//this lists 200 instances of the same date
}
这可能是愚蠢的事,但我不知所措。
由于
答案 0 :(得分:6)
在循环中,您为paydates[i]
分配了firstDate
。在200次迭代结束时,paydates
数组中的所有200个位置都指向最后一个firstDate
。
您应该在每次迭代中创建一个新的Date
实例,然后将其分配给paydates
数组中的索引。
另外,您会注意到示例中列出的第一个日期是不是 12/26/2010,但是2011年1月9日。我不确定这是错误的还是故意的,但是正如您的代码所示,第一个firstDate
不是您用来为日期数组设定种子的日期。
JSFiddle一个可以简化代码的工作示例。这是来自小提琴的准系统代码:
var paydates = []; // new array
var firstDate = new Date(2010, 11, 26); // seed date
for (var i = 0; i < 200; i++) {
paydates.push(new Date(firstDate.getTime()));
firstDate.setDate(firstDate.getDate() + 14); // add 14 days
}
答案 1 :(得分:3)
将第一个循环替换为:
var temp;
for (i=0; i < 200; i++) //put 200 dates in our array
{
temp = new Date(firstDate.getTime());
paydates[i] = temp;
firstDate.setDate(firstDate.getDate()+14); //add 14 days
document.write("1st: " + i + ":" + paydates[i] + "<br />");
}
问题在于您将对one和firstDate对象的引用存储到数组中的每个索引。
答案 2 :(得分:2)
您必须根据第一个日期创建new Date
以获取数组中每个元素的单独日期而不是:
paydates[i] = firstDate;
firstDate.setDate(firstDate.getDate()+14); //add 14 days
写:
paydates[i] = new Date( firstDate.setDate(firstDate.getDate()+14));