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

5
我想使用EmberJS复制一个复杂的对象。这个对象包含了数组、其他对象、数据值、字符串和其他值。我看到Copy方法已经被弃用,现在有一个叫做ember-copy的插件来替代它。
我尝试使用ember-copy插件,但是当我把第二个参数设置为true(表示我需要进行深度复制)时,它会提示我无法复制一个没有实现Ember.Copyable接口的对象。于是,我把这个对象转换成了一个EmberObject,并传入了Copyable mixin,但即使这样,它仍然提示我需要实现一个Copy方法。我不明白为什么我需要手动实现复制方法,如果这是框架本身应该能够完成的事情,那么为什么还需要ember-copy插件呢?
我认为克隆一个对象应该是框架必须具备的功能之一。在我使用过的每个框架中,都提供了一种可以轻松完成这个操作的方式,但是在Ember中似乎很难做到。

3
根据官方存储库中的评论,我认为使用JSON.parse(JSON.stringify(obj))是可行的方式。 - Rodrigo Ferreira
不,简单的JSON字符串方法通常没有用处。 - user1028880
我理解这个问题,一种可能的方法是利用ES6代理。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy 我稍后会提供一个示例代码。 - user1028880
1
@KenOKABE - "often",但这实际上取决于原始复杂对象。问题说明对象包含“数组、其他对象、数据值、字符串和其他值”,这是模糊不清的……这些“其他对象”是什么?它们是Object吗?而“其他值”……还有什么其他值?是否存在循环引用?- JSON方法的缺点是原型将丢失。克隆对象将从Object类创建。将在循环对象中抛出错误。- 参考 http://voidcanvas.com/clone-an-object-in-vanilla-js-in-depth/。 - Jaromanda X
根据您的使用情况,您可能想要使用ember-changesetember-buffer-proxy。它们不像Ember的已弃用的copy方法一样创建对象的副本,而是提供一个代理,缓冲更改直到应用于您的对象。 - jelhan
显示剩余2条评论
2个回答

2
你也可以使用扩展运算符(ES6)来复制(和修改)你的对象。正如Ember文档中所述,ember.copy已经被弃用。翻译成中文为:"你也可以使用扩展运算符(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 }

enter image description here


4
展开运算符(Spread Operator)复制是浅拷贝,类似于Object.assign。它不会复制嵌套的复杂对象或数组(新的副本将引用与原始对象相同的嵌套对象)。OP正在寻找深层复制。 - Josh KG

0
你应该调用Ember的copy助手来无缝地深度复制复杂对象。
它接受两个参数:objdeepobj(Object)是要克隆的对象,deep(Boolean)如果为true,则创建对象的深拷贝。
例如:
obj1 = {name: 'john', surname: {paternal: 'Doe', maternal: 'Cena'}};
obj2 = Ember.copy(obj1, true); // creates deep clone of my obj.

Ember 复制帮助文档。


2
“Copy”在最新版本中已被弃用。 - Driezzz
Driezzz,你是什么意思?我分享的Ember文档链接是来自于目前最新的Ember 3.4版本。请提供证据支持你的说法。 - siwalikm
2
https://github.com/emberjs/rfcs/pull/322 已接受的RFC。此外,在网站上直接在“Function”下面写着“public deprecated”。 - Driezzz

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