Как скопировать объект JavaScript в новую переменную НЕ по ссылке?

Я написал быстрое jsfiddle здесь, где я передаю небольшой объект 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, чтобы изменение исходной переменной не изменило новую переменную?

2 ответа

Решение

Я обнаружил, что следующее работает, если вы не используете jQuery и заинтересованы только в клонировании простых объектов (см. Комментарии).

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

Ваш единственный вариант - как-то клонировать объект.

Посмотрите на этот вопрос о стеке потока, как вы можете этого достичь.

Для простых объектов JSON самый простой способ:

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

если вы используете jQuery, вы можете использовать:

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

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

ОБНОВЛЕНИЕ 2017: Я должен упомянуть, так как это популярный ответ, что теперь есть лучшие способы добиться этого, используя более новые версии javascript:

В ES6 или TypeScript (2.1+):

var shallowCopy = { ...oldObject };

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

Обратите внимание, что если extraProp также является свойством на oldObject, его значение не будет использоваться, потому что extraProp : "abc" указывается позже в выражении, которое по существу переопределяет его. Конечно, oldObject не будет изменен.

Другие вопросы по тегам