185

ここでは、小さなJSONオブジェクトを新しい変数に渡し、元の変数 (新しい変数ではない) のデータを変更しますが、新しい変数のデータも更新されます。これは、JSON オブジェクトが参照によって渡されたことを意味するに違いありません。

ここに私の簡単なコードがあります:

var json_original = {one:'one', two:'two'}

var json_new = json_original;

console.log(json_original); //one, two
console.log(json_new); //one, two

json_original.one = 'two';
json_original.two = 'one';

console.log(json_original); //two, one
console.log(json_new); //two, one

元の変数を変更しても新しい変数が変更されないように、JSON オブジェクトのディープ コピーを作成する方法はありますか?

4

2 に答える 2

264

jQuery を使用しておらず、単純なオブジェクトのクローン作成のみに関心がある場合は、次の方法が機能することがわかりました(コメントを参照)。

JSON.parse(JSON.stringify(json_original));

ドキュメンテーション

于 2013-08-21T13:47:06.073 に答える
118

あなたの唯一の選択肢は、どうにかしてオブジェクトを複製することです。

これを達成する方法については、このスタックオーバーフローの質問を参照してください。

単純な JSON オブジェクトの場合、最も簡単な方法は次のとおりです。

var newObject = JSON.parse(JSON.stringify(oldObject));

jQuery を使用する場合は、次を使用できます。

// Shallow copy
var newObject = jQuery.extend({}, oldObject);

// Deep copy
var newObject = jQuery.extend(true, {}, oldObject);

UPDATE 2017: これは一般的な回答であるため、新しいバージョンの JavaScript を使用してこれを達成するためのより良い方法があることを言及する必要があります。

ES6 または TypeScript (2.1+) の場合:

var shallowCopy = { ...oldObject };

var shallowCopyWithExtraProp = { ...oldObject, extraProp: "abc" };

extraPropが oldObject のプロパティでもある場合、その値は使用されないことに注意してくださいextraProp : "abc"。もちろん、oldObject は変更されません。

于 2013-08-21T13:44:51.337 に答える