2016-11-10 3 views
0

Я немного смущен об этом.javascript array date error

Этот фрагмент кода работает хорошо, но имеет странное поведение.

var tmpcurdte = eval(dataSource[i].startDate); 
tmpcurdte.setDate(tmpcurdte.getDate() + 1); 

while (tmpcurdte < tmpenddte) { 
    console.log("block date: " + tmpcurdte); 
    blockdayarray[blockdayarray.length] = tmpcurdte; 
    console.log("blockdayarray: " + blockdayarray); 
    tmpcurdte.setDate(tmpcurdte.getDate() + 1); 
} 

Выход

block date :Sat Nov 12 2016 00:00:00 GMT+0100 (CET) 
blockdayarray :**Sat Nov 12** 2016 00:00:00 GMT+0100 (CET) 
block date :Sat Dec 31 2016 00:00:00 GMT+0100 (CET) 
blockdayarray :**Sun Nov 13** 2016 00:00:00 GMT+0100 (CET),**Sat Dec 31** 2016 00:00:00 GMT+0100 (CET) 
block date :Sun Jan 01 2017 00:00:00 GMT+0100 (CET) 
blockdayarray :Sun Nov 13 2016 00:00:00 GMT+0100 (CET),**Sun Jan 01 2017** 00:00:00 GMT+0100 (CET),**Sun Jan 01 2017** 00:00:00 GMT+0100 (CET) 
block date :Sat Feb 04 2017 00:00:00 GMT+0100 (CET) 
blockdayarray :Sun Nov 13 2016 00:00:00 GMT+0100 (CET),Mon Jan 02 2017 00:00:00 GMT+0100 (CET),**Mon Jan 02 2017** 00:00:00 GMT+0100 (CET),Sat Feb 04 2017 00:00:00 GMT+0100 (CET) 

Как вы можете видеть, что предыдущая дата в массиве изменяется, когда я нажимаю новый. Может ли кто-нибудь помочь/объяснить это?

+0

Почему вы делаете вещь 'eval'? – ArsalanDotMe

+0

читайте ниже. thx за то, что уделил время исследователю моего кода :-) – user3242509

ответ

1

Это потому, что вы нажимаете на тот же самыйDate объект на массив неоднократно и меняет свое состояние.

Вместо этого, вы хотите создать новый Date объект на следующий день:

var tmpcurdte = eval(dataSource[i].startDate); 
tmpcurdte.setDate(tmpcurdte.getDate()+1); 

while (tmpcurdte < tmpenddte) { 
    console.log("block date :" + tmpcurdte); 
    blockdayarray[blockdayarray.length]=tmpcurdte; 
    console.log("blockdayarray :" + blockdayarray); 
    tmpcurdte = new Date(tmpcurdte.getTime());  // *** 
    tmpcurdte.setDate(tmpcurdte.getDate() + 1); 
} 

Side Примечание: Я не совсем уверен, что вы делаете с этим вызовом eval , но есть почти наверняка лучший способ сделать то, что у вас есть.

+0

Отлично, ваше решение отлично работает. Я тоже жесткая, это была эталонная вещь, но она не могла понять. eval предназначен для анализа строки даты, возвращаемой php, в качестве объекта даты.
Я поменяю его потом, но на данный момент он отлично работает. Мне нужен этот объект даты в виджетах thx за вашей помощью, B – user3242509

+0

Извините, я не мог голосовать за вас. – user3242509