【问题标题】:JavaScript push object into array changed value of objectJavaScript 将对象推入数组改变对象的值
【发布时间】:2015-10-19 05:51:37
【问题描述】:

我不确定应该使用什么关键字来搜索我的问题。但是我一直在墙上敲了三个小时,试图看看这里出了什么问题。它只是一个简单的将对象推入数组。问题是,当我尝试 console.log 数组值时,两个 object 键的值被更改。我在一个 AngularJS 控制器中写这个。

这是我放在服务上的示例对象:

onbd.data.add = {
    predefined: [{
        activity : 'morning jog',
        purpose  : 'grow',
        days     : '0 1 2 3 4 5 6',
        start    : '05:30',
        stop     : '06:00',
        meta     : 'repeats everyday on 5:30 AM for half an hour'
    }]
};

在控制器中,这里是在ng-click事件上调用的函数,它将把服务中的数据推送到AJAX数据数组中:

th.setActivity = function (data) {
    // the data is one of the object inside the predefined
    // key from the service above
    var newAct = {
        activity : data.activity,
        purpose  : data.purpose,
        day      : data.days,
        start    : data.start,
        stop     : data.stop
    };
    th.list.push(newAct);
};

这是我从console.log('newAct', newAct)得到的:

newAct Object {
    activity: "morning jog",
    purpose: "grow",
    day: "0 1 2 3 4 5 6",
    start: "05:30",
    stop: "06:00"

}

这是正确的,但这是我console.log('list', th.list);时得到的:

list [Object]
    0: Object
        $$hashKey: "object:136"
        activity: "morning jog"
        day: "0 1 2 3 4 5 6"
        purpose: "grow"
        start: "05:30"
        stop: "06:00"
    length: 1
    __proto__: Array[0]

请注意,daypurpose 的键已更改。仅当我执行 th.setActivity 函数时才会发生这种情况。有什么想法为什么会出现这种奇怪的行为?

非常感谢。

【问题讨论】:

  • 对象通过引用传递,控制台(在 chrome 中)将尝试提供帮助并保持该引用是最新的。这些值是否在其他地方被修改?
  • 不,它们没有被修改。我还有另一个类似的功能,它将处理来自form 的数据输入,而不是服务上的预定义数据。但是那个工作没有任何问题。
  • 由于你是通过ajax获取数据,这是异步的,我猜你需要$scope.$apply
  • 你能在 th.list.push(newAct) 之前检查 console.log('newAct', newAct);行
  • @Joy 我想你误会了,我不使用 AJAX 来提供预定义的数据,它被硬编码在服务上以便在控制器之间共享。但是这些数据稍后将通过 AJAX 发送到POSTed,这是我在服务器端收到错误的地方,因为密钥的值已更改。

标签: javascript arrays angularjs object


【解决方案1】:

我想通了,感谢@tymeJV 指出控制台正试图使对象引用保持最新这一事实。我决定console.log()一一发现问题。 @tymeJV 是正确的,值的不同是其他一些函数修改对象的结果。

我的错误是,修改函数期望接收object 作为值,而不是像我在服务中所说的string。我已经更新了它,现在它可以工作了。

我很傻,我知道:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 2017-12-05
    • 2016-05-09
    • 2018-11-08
    • 2023-03-29
    • 2021-05-06
    • 1970-01-01
    相关资源
    最近更新 更多