2016-10-10 15 views
5

私はしばらくここをサーフィンしていて、まだ私のために働いた答えは見つけられていません。JavaScriptでカスタムオブジェクトをディープコピーする方法はありますか?

JSの非プレーンオブジェクトをディープコピーする方法はありますか?

私はjQuery.extend(true, {}, this)を試しましたが、一部だけをクローンしました。残りは別のオブジェクトへの参照として残りました。

+1

_「が、それはそれだけの一部をクローン化されたが、残りは別のオブジェクトへの参照として残った。」_あなたが証明するためにstacksnippetsを作成し、質問にオブジェクトを含めることはできますか? – guest271314

+0

常に 'JSON.parse(JSON.stringify(...))'ハックがあります。 –

+1

@AkshatMahajan JSON形式の場合、それは機能があることを示唆しています。 – epascarello

答えて

4

あなたはlodashのcloneDeep機能を使用することができます - (ドキュメントから)https://lodash.com/docs/4.16.4#cloneDeep

var objects = [{ 'a': 1 }, { 'b': 2 }]; 

var deep = _.cloneDeep(objects); 
console.log(deep[0] === objects[0]); 
// => false 
7

オブジェクトが値として任意の循環参照や機能を持っていない場合、あなたはJSON文字列化のトリックを使用することができます:

let myCopy = JSON.parse(JSON.stringify(myObject)); 

ほとんどのオブジェクトではライブラリは必要ありません。

+0

このコピーは 'myObject'で機能しますか? – guest271314

+1

@ guest271314しかし、なぜデータ構造に関数を追加するのですか?関数は別の場所のルーチンと同じでなければなりません。これはちょうどOOPに失敗します)) – Deep

+0

@Deep関数が値として設定されるプロパティを持つオブジェクトの例は 'document'か' window'でしょう – guest271314

0

クラスインスタンスを扱う場合は、このようなものを使用できます。

プロトタイプに委譲されている関数をコピーする必要はありません。

// myObject constructor 
 
function myObject(foo, bar){ 
 
    this.foo = foo 
 
    this.bar = bar 
 
} 
 
// delegate the functions to a prototype 
 
myObject.prototype.something = function(){ 
 
    console.log('something') 
 
} 
 

 
function instanceCopy(obj) { 
 
    // copy the object by the constructor 
 
    const copy = new obj.constructor() 
 
    const keys = Object.keys(obj) 
 
    keys.forEach(key => { 
 
    copy[key] = obj[key] 
 
    }) 
 
    return copy 
 
} 
 

 
const myObj = new myObject('foo', 'bar') 
 
const copyObj = instanceCopy(myObj) 
 

 
console.log('myObj', myObj) 
 
console.log('copyObj', copyObj) 
 
console.log('same ?', copyObj === myObj) 
 

 
// can we still call the functions 
 
copyObj.something()
<script src="https://codepen.io/synthet1c/pen/WrQapG.js"></script>