2016-12-05 66 views
3

如何在角度2中創建深度複製,我嘗試使用let newObject = Object.assign({}, myObject),但仍然反映了在newObject中所做的所有更改。創建角度爲2的深度複製

+0

我認爲它的打字稿問題不angular2。糾正我,如果我錯了 –

+0

你的意思是深拷貝或淺拷貝? http://stackoverflow.com/questions/184710/what-is-the-difference-between-a-deep-copy-and-a-shallow-copy –

+0

@SurajRao好了,現在我也困惑,我只是想重置我的對象在默認狀態下,當我的工作完成了該對象。所以要做到這一點,我需要存儲該默認副本,但是當我在一個地方進行更改時,所有其他副本也會被更改。如何防止呢? –

回答

2

只需使用以下功能:

/** 
* Returns a deep copy of the object 
*/ 

public deepCopy(oldObj: any) { 
    var newObj = oldObj; 
    if (oldObj && typeof oldObj === "object") { 
     newObj = Object.prototype.toString.call(oldObj) === "[object Array]" ? [] : {}; 
     for (var i in oldObj) { 
      newObj[i] = this.deepCopy(oldObj[i]); 
     } 
    } 
    return newObj; 
} 
0

嘗試使用Lodash.js。因爲角度2沒有任何深度複製的方法。更多信息參見:https://lodash.com/docs#cloneDeep

或者您可以使用此javascript函數

var copy = Object.assign({}, myObject); 
+0

您是否認爲只爲這一功能包含lodash是合理的? 要添加2個數字,你會安裝math.js嗎?那麼你會不斷添加隨機的第三方庫來處理你遇到的每一件小事? – Azarus

+0

這就是爲什麼我已經給出了第二個選項 –

+1

,但我知道那是錯的可悲。請參閱文檔: 警告的深克隆 對於深克隆,我們需要使用其他的替代品,因爲Object.assign()copies屬性值。如果源值是對某個對象的引用,它只會複製該引用值。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign – Azarus