【问题标题】:javascript push method on global object array overwrites all values in array全局对象数组上的 javascript push 方法覆盖数组中的所有值
【发布时间】:2016-12-29 12:56:45
【问题描述】:

我已经查看了有关此问题的先前帖子,但无法获得普遍建议的解决方案来为我工作。 evtList 是“事件”类型的对象的全局数组。以前的帖子表明,在我的循环中创建一个本地对象(“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);
}

【问题讨论】:

  • 您要添加到您正在循环的数组中?
  • 为什么你认为对象是相同的?它们是不同的对象,但 evtTime 对于所有对象都是相同的,因为它们都引用相同的日期 (nextTime)。除此之外,您推送的 newEvent 元素是一个普通的 JavaScript 对象,而不是 Event 类型的对象。
  • 下一个时间值会在你推送之前改变,因为你正在更新所有 newEvent 对象都存在的相同引用......所以即使你正在添加一个新对象...... .对象的组成部分具有相同的值......这就是为什么您会看到所有对象都具有相同的值
  • 我正在构建一组时间线事件(对象)。每个新事件在前一个事件之后以正态分布的间隔发生。时间线在达到或超过用户设置的 dayEnd Date 值时停止。,

标签: javascript arrays push


【解决方案1】:

在 JavaScript 中,var 没有定义块级作用域,而是定义了函数级作用域,因此 newEvent 不是你的 for 循环的局部变量,而是它所属的函数体,或者全局作用域 if它不在函数中。

有了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);
}

您推送到您的evtListnewEvent 不是Event 类型,因为您使用newEvent = new Event 创建的Event 对象被此处的普通JavaScript 对象覆盖:

newEvent = ({
  value: 1,
  station: 0,
  evtTime: nextTime
});

您要么只想设置新创建的Event 对象的属性:

newEvent.value = 1;
newEvent.station = 0;
newEvent.evtTime = nextTime;

或者您可以将它们传递给您的Event 构造函数。

【讨论】:

  • 完美!那行得通!非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
相关资源
最近更新 更多