Javascript推送对象作为克隆

Javascript推送对象作为克隆,javascript,json,d3.js,javascript-objects,Javascript,Json,D3.js,Javascript Objects,我将d3用于交互式网络应用程序。我需要绑定的数据在交互过程中会发生更改,并由我的JSON变量中的一些选定对象组成。 为此,我在JSON变量上使用了map,并进行了一些查询以选择适当的对象。对象被推送到一个列表上,该列表作为新数据绑定。 我的问题是,Javascript将对象作为引用推送。虽然d3进行了一些奇特的数据修改,但我的JSON变量变得凌乱,我的查询将无法继续工作。 我是否需要用类似于JSON.stringify()或jQuery.extend()的东西复制每个对象,或者是否有不同的解决方

我将d3用于交互式网络应用程序。我需要绑定的数据在交互过程中会发生更改,并由我的JSON变量中的一些选定对象组成。
为此,我在JSON变量上使用了map,并进行了一些查询以选择适当的对象。对象被推送到一个列表上,该列表作为新数据绑定。
我的问题是,Javascript将对象作为引用推送。虽然d3进行了一些奇特的数据修改,但我的JSON变量变得凌乱,我的查询将无法继续工作。

我是否需要用类似于
JSON.stringify()
jQuery.extend()
的东西复制每个对象,或者是否有不同的解决方案将我的JSON变量与作为数据传递的对象数组解耦?

每个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)

这样,列表中的数据就不会被修改。

如果您只需要一个浅拷贝,您可以这样做:

arr.push({...o})

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

不要执行
JSON.parse(JSON.stringify(oldObject))
。使用json确实是一种黑客行为,不应该受到鼓励。我已经提到,它更像是一种黑客行为,也是
对象。assign
是ES6的一项功能,因此在所有现代浏览器中都不受支持。例如,Internet Explorer还不支持此功能。这是正确的,但他可以使用transpillers实现这一点。如果他支持新的ES功能,这是最好的方式,当然,但请在您的回答中提及这一点。不是每个人都知道的。看看。使用
stingify()
/
parse()
不是一个坏主意。这并不理想,还有一些问题需要特别注意,但它可能是最快的候选人。