JavaScript中将对象作为克隆推入数组的方法

6

我正在使用d3开发一个交互式网络应用。在交互过程中,我需要绑定的数据会发生变化,由JSON变量中的一些选定对象组成。
为此,我在JSON变量上使用了map,并进行了一些查询以选择适当的对象。对象被推到列表中,该列表被绑定为新数据。
我的问题是JavaScript只是将对象作为引用推送。虽然d3进行了一些花哨的数据修改,但我的JSON变量变得混乱,我的查询不再起作用。
我是否需要使用 JSON.stringify()jQuery.extend()这样的方法复制每个对象,或者是否有不同的解决方案可以使我的JSON变量与我传递的对象数组分离?


1
看一下"JavaScript中克隆对象的最有效方法是什么?"。使用stringify() / parse()并不是一个坏主意。虽然不是理想的方法,需要特别注意一些问题,但它可能是最快的选择。 - altocumulus
2个回答

13

如果你只需要浅拷贝,你可以这样做:

arr.push({...o})

假设 o 是您想要同时推送和克隆的对象。


8

每个JS对象都是作为引用传递的(对象、数组、函数等)。要对特定对象进行“深度复制”,可以执行以下操作:

var deepCopy = JSON.parse(JSON.stringify(oldObject)) // 1. - more of a hack
var deepCopy = _.cloneDeep(oldObject); // 2. use some predefined methods from jQuery, lodash or any other library

var shallowCopy = Object.assign({}, oldObject) // 1. - preferred (if you support new ES features)

这样,您在列表上的数据就不会被修改。

不要使用 JSON.parse(JSON.stringify(oldObject))。通过 JSON 真的是一种 hack,不应该被鼓励。 - WouterH
我已经提到这更像是一个hack。 - Oskar Szura
1
另外,Object.assign是ES6的一个特性,因此并不被所有现代浏览器支持。例如,Internet Explorer尚未支持此功能。 - LordTribual
没错 - 但他可以使用转译器来实现 - 如果他支持新的 ES 特性,这是最好的方式,我认为。 - Oskar Szura
1
当然,但请在你的回答中提到。并非每个人都知道那一点。 - LordTribual

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接