【问题标题】:Javascript: Push array of objects to array [duplicate]Javascript:将对象数组推送到数组[重复]
【发布时间】:2017-10-14 16:39:55
【问题描述】:

我有一个对象数组(全局范围):

objects =[{id:"0",radius:3,},{id:"1",radius:2,}].

这个数组是通过改变单个对象来操作的:

objects =[{id:"0",radius:4,},{id:"1",radius:5,}].

或通过将新对象推送到数组:

objects =[{id:"0",radius:4,},{id:"1",radius:5,},{id:"2",radius:3,}].

每次操作后,我想将整个数组保存到另一个名为“历史”的数组中,以便能够调用每个状态。

我试过了:

var history_obj =[];

var history_index = 0;

function save_to_history(){history_obj[history_index]=objects; history_index++;} 

还有:

function save_to_history(){history_obj.push(objects); history_index++;} 

我调试了脚本并发现,在运行 save_to_history() 函数 n 次后,我的 history_obj 包含许多 n 个数组,但是所有数组都是相同的(应该是最后一个要推送)不是 [[state1],[state2],[state3]] 而是 [[state3],[state3],[state3]]。

我在这个论坛上读到,这个问题与范围有关。

所以我试过了:

function save_to_history(){
var status = objects; 
history_obj[history_index]=status;
history_index++;} 

结果是一样的。 提前感谢您的帮助。

【问题讨论】:

标签: javascript arrays


【解决方案1】:

您可以使用JSON.stringify() 将当前数组作为字符串推送到数组中。

【讨论】:

  • 非常感谢,这似乎可以完成这项工作。
【解决方案2】:

您正在将相同的引用添加到您的历史记录中,您需要先克隆它然后添加它,如下所示:

JSON.parse(JSON.stringify(arr));

【讨论】:

  • 非常感谢,这似乎可以完成这项工作。
【解决方案3】:

这应该可以解决问题:

function save_to_history(){
    history_obj.push(JSON.parse(JSON.stringify(objects)))
}

因为您需要 deepcopy 对象,否则它会继续更改,每当您的 objects 更改并因此所有值都将相同,这正是您得到的。

【讨论】:

  • 非常感谢,这似乎可以完成这项工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 2014-05-16
  • 2021-07-20
  • 1970-01-01
相关资源
最近更新 更多