2011-12-26 3 views
1

Я пытаюсь заполнить массив списком дат.Почему этот массив javascript не работает?

Когда я возвращаюсь, чтобы получить дату в массиве, все они совпадают с датой.

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 
} 

Это, наверное, что-то глупое, но я в недоумении.

Благодаря

ответ

6

В вашем цикле, вы назначаете paydates[i] ссылку на firstDate. В конце 200 итераций все 200 местоположений в массиве paydates указывают на последние firstDate.

Вы должны создать новый экземпляр Date в каждой итерации и затем присвоить его индекс в массиве paydates.

Кроме того, вы заметите, что первое число, указанное в вашем примере, равно не 12/26/2010, но 1/9/2011. Я не уверен, что это ошибка или намеренный, но, как ваш код, первый 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 
} 
+0

Высокий. Спасибо за помощь. –

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 />"); 
} 

Проблема заключалась в том, что вы хранили ссылку на ваш одно и только firstDate объекта для каждого индекса в вашем массив.

+1

Я бы объявил 'var temp;' вне цикла 'for'. В любом случае, JavaScript работает с функциональностью, так что это все равно. Лучше быть явным. – PPvG

+0

Да, 'var temp' лучше объявляется снаружи в начале функции. Это фактически спасет время выполнения всех проблем, связанных с игнорированием переоценки. Ответ отредактирован. – techfoobar

+0

Как насчет забывания о 'temp' и использовании' paydates [i] = new Date (firstDate.getTime()); 'как первая строка в for-loop? –

2

Вы должны создать new Date, основанный на firstDate получить индивидуальную дату к каждому элементу в массиве

Вместо:

paydates[i] = firstDate; 
firstDate.setDate(firstDate.getDate()+14); //add 14 days 

пишут:

paydates[i] = new Date(firstDate.setDate(firstDate.getDate()+14)); 
Смежные вопросы