私はしばらくここをサーフィンしていて、まだ私のために働いた答えは見つけられていません。JavaScriptでカスタムオブジェクトをディープコピーする方法はありますか?
JSの非プレーンオブジェクトをディープコピーする方法はありますか?
私はjQuery.extend(true, {}, this)
を試しましたが、一部だけをクローンしました。残りは別のオブジェクトへの参照として残りました。
私はしばらくここをサーフィンしていて、まだ私のために働いた答えは見つけられていません。JavaScriptでカスタムオブジェクトをディープコピーする方法はありますか?
JSの非プレーンオブジェクトをディープコピーする方法はありますか?
私はjQuery.extend(true, {}, this)
を試しましたが、一部だけをクローンしました。残りは別のオブジェクトへの参照として残りました。
あなたは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
オブジェクトが値として任意の循環参照や機能を持っていない場合、あなたはJSON文字列化のトリックを使用することができます:
let myCopy = JSON.parse(JSON.stringify(myObject));
ほとんどのオブジェクトではライブラリは必要ありません。
このコピーは 'myObject'で機能しますか? – guest271314
@ guest271314しかし、なぜデータ構造に関数を追加するのですか?関数は別の場所のルーチンと同じでなければなりません。これはちょうどOOPに失敗します)) – Deep
@Deep関数が値として設定されるプロパティを持つオブジェクトの例は 'document'か' window'でしょう – guest271314
クラスインスタンスを扱う場合は、このようなものを使用できます。
プロトタイプに委譲されている関数をコピーする必要はありません。
// 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>
_「が、それはそれだけの一部をクローン化されたが、残りは別のオブジェクトへの参照として残った。」_あなたが証明するためにstacksnippetsを作成し、質問にオブジェクトを含めることはできますか? – guest271314
常に 'JSON.parse(JSON.stringify(...))'ハックがあります。 –
@AkshatMahajan JSON形式の場合、それは機能があることを示唆しています。 – epascarello