Javascript 如何使用EmberJS深度复制复杂对象

Javascript 如何使用EmberJS深度复制复杂对象,javascript,ember.js,Javascript,Ember.js,我想用EmberJS复制一个复杂的对象。此对象包含数组、其他对象、数据值、字符串和其他值。我看到Copy方法已被弃用,并且有一个名为ember Copy的插件来替换它 我试图使用ember copy插件,但当我将第二个参数设置为true(表示我需要深度复制)时,它表示我无法复制未实现ember.Copyable的对象。我将这个对象转换为一个EmberObject,传递了可复制的混合,但即使这样,它也表示我需要实现一个复制方法。我不明白如果我需要手动实现,为什么我需要ember copy插件 我相

我想用EmberJS复制一个复杂的对象。此对象包含数组、其他对象、数据值、字符串和其他值。我看到Copy方法已被弃用,并且有一个名为ember Copy的插件来替换它

我试图使用ember copy插件,但当我将第二个参数设置为true(表示我需要深度复制)时,它表示我无法复制未实现ember.Copyable的对象。我将这个对象转换为一个EmberObject,传递了可复制的混合,但即使这样,它也表示我需要实现一个复制方法。我不明白如果我需要手动实现,为什么我需要ember copy插件


我相信克隆对象应该是框架必须能够做到的事情。我使用的每一个框架都提供了一种不费吹灰之力就能实现的方法,但使用Ember似乎很难做到。

您应该调用Ember的
copy
帮助程序来无缝地深度复制复杂对象

它接受两个参数,
obj
deep

obj(Object)
是要克隆的对象,
deep(Boolean)
如果为true,则生成对象的深度副本

例如


您还可以使用扩展运算符(ES6)复制(和修改)对象。事实上,正如ember文档中所述,ember.copy已被弃用

const original = { a: 1, b: 2 };
const copy = { ...original, c: 3 }; // copy => { a: 1, b: 2, c: 3 }
const { a, ...noA } = copy; // noA => { b: 2, c: 3 }

JSON.parse(JSON.stringify(obj))
是一条路,我认为,根据官方报告,简单的JSON字符串方法通常没有用处。我理解这个问题,一种可能的方法是利用ES6代理。稍后我将提供一个示例代码。@KenOKABE-“经常”,但实际上取决于原始复杂对象。问题指出对象包含“数组、其他对象、数据值、字符串和其他值”-这是模糊的。。。这些“其他对象”是什么,它们是
Object
s吗?和
其他值
。。。还有什么其他价值观?是否有任何循环参考JSON方法的缺点是
原型将丢失。克隆对象将从对象类创建。
将在循环对象中抛出错误。
-根据@JaromandaX的说法,深度复制是一个令人头痛的问题,许多人说,哦,很简单,只需使用“Json Stringfy/Parse”。事实并非如此简单。Undercore/Lo dash库是否对DeepCopy严格使用Json?绝对不是。这是有原因的。一个避免混乱的干净方法是使用ES6代理,它可能不是一个银弹,但在许多情况下,这种方法满足了我们的需要。我已经发布了一个示例代码作为答案。“Copy”在最新版本中被弃用。你说的driezz是什么意思?余烬文件链接我共享,如果从余烬3.4版本,这是目前最新的。请举出证据证明你的主张。接受RFC。此外,它在网站上的“功能”-“公共弃用”下说,spread operator副本很浅,类似于Object.assign。它不会复制嵌套的复杂对象或数组(新副本将引用与原始副本相同的嵌套对象)。OP正在寻找深度副本。
const original = { a: 1, b: 2 };
const copy = { ...original, c: 3 }; // copy => { a: 1, b: 2, c: 3 }
const { a, ...noA } = copy; // noA => { b: 2, c: 3 }