2016-09-15 3 views
2

Действительно не могу понять, почему даты, которые я вдавливаю в массив, не являются датами, которые выходят, когда я вызываю массив в консоли. то есть я бы ожидал, что первая запись в массиве будет сегодняшней датой, и это то, что возвращается из обоих предупреждений, но когда я проверяю первую позицию массива, вместо этого она имеет вчерашнюю дату !?Заполните массив датами

function sevenDayPeriod(date) { 

    for (var i = 0; i <=6; i++) { 

     alert(date); //check to see date is today's date 
     dateRange[i] = date; 
     alert(dateRange[i]); //confirm that what I've pushed to array is today's date 

     date = date.setDate(date.getDate() - 1); 
     date = new Date(date); 
    } 
}; 

var dateRange = []; 
var today = new Date(); 

sevenDayPeriod(today); 

Благодаря

ответ

6
... 
dateRange[i] = date; 
alert(dateRange[i]); //confirm that what I've pushed to array is today's date 
date = date.setDate(date.getDate() - 1); 
... 

В первом из приведенных выше строк, которые задают го элемента массива в date (ссылка), то вы показать его, а затем изменить один и тот же объект с setDate, что приводит в вашей проблеме, поскольку элемент массива все еще указывает на этот измененный объект.
Вы можете решить это, например, с другим варом, как так

... 
var prevDay = new Date(); 
prevDay.setDate(date.getDate() - 1); 
date = prevDay; 
... 

или создать копию предварительного чтобы толкая его в массив

+3

Спасибо за объяснение. Делает прекрасный смысл и, надеюсь, то, чему я научусь! –

2

function sevenDayPeriod(date) { 
 
    for (var i = 0; i <=6; i++) { 
 
\t //date object is as a "pointer", you have to clone it 
 
\t var copiedDate = new Date(date); 
 
\t \t 
 
     //alert(date); //check to see date is today's date 
 
     dateRange[i] = copiedDate; 
 
     //alert(dateRange[i]); //confirm that what I've pushed to array is today's date 
 
\t \t 
 
     date = date.setDate(date.getDate() - 1); 
 
     date = new Date(date); 
 
    } 
 
}; 
 

 
var dateRange = []; 
 
var today = new Date(); 
 

 
sevenDayPeriod(today); 
 

 
console.log(dateRange);

При изменении даты, вы вы также изменение датированной даты. Вы должны клонировать его.

Смежные вопросы