我已经回顾了以前关于此问题的帖子,但未能获得通常建议的解决方案。 evtList是“Event”类型的全局对象数组。以前的帖子表明在我的循环中创建一个本地对象(“newEvent”),定义它的元素,然后将本地对象推送到全局数组应该有效。但是,我发现只要在newEvent对象中为元素声明一个新值,全局数组中的所有对象都会在推送操作之前更改为该组值。我错过了什么?
var i = 0;
var nextTime = new Date();
while (evtList[i].evtTime < dayEnd) {
i++;
var newEvent = new Event;
var milliSecs = (evtList[i-1].evtTime).getTime() + gaussian(arrStations[0].mean, arrStations[0].stdDev);
nextTime.setTime(milliSecs);
newEvent = ({value: 1, station: 0, evtTime: nextTime});
evtList.push(newEvent);
}
答案 0 :(得分:1)
在JavaScript var
中没有定义块级范围而是函数级范围,所以newEvent
不是你的for循环的本地,而是它所属的函数体,或者是全局范围,如果它不在函数中。
与您[{1}}一起向push
添加不同的对象,但问题是每个对象的属性evtList
引用相同的evtTime
对象,因此使用Date
,您将更改所有nextTime.setTime(milliSecs)
属性的日期,因为它是同一个对象。
您需要为每个对象创建一个新的evtTime
对象:
Date
您推送到var newEvent;
var milliSecs;
var nextTime;
var i = 0;
while (evtList[i].evtTime < dayEnd) {
i++;
// newEvent = new Event;
nextTime = new Date;
milliSecs = (evtList[i - 1].evtTime).getTime() + gaussian(arrStations[0].mean, arrStations[0].stdDev);
nextTime.setTime(milliSecs);
newEvent = ({
value: 1,
station: 0,
evtTime: nextTime
});
evtList.push(newEvent);
}
的{{1}}不属于newEvent
类型,因为您创建的evtList
对象已被Event
覆盖这里是普通的JavaScript对象:
Event
您要么只想设置新创建的newEvent = new Event
对象的属性:
newEvent = ({
value: 1,
station: 0,
evtTime: nextTime
});
或者您可以将它们传递给Event
构造函数。