Клонирование объекта в javascript
ниже сначала регистрирует 0, а затем регистрирует 1. Как сохранить копию объекта, а не ссылку на него?
debug.log(vi.details.segment);
vi.nextSegment = vi.details;
vi.nextSegment.segment++;
debug.log(vi.details.segment);
6 ответов:
для клонирования объекта в jQuery:
var vi.nextSegment = jQuery.extend({}, vi.details);
Примечание: вышеописанное является мелкой копией: любые вложенные объекты или массивы будут скопированы по ссылке-это означает любые изменения, которые вы вносите в
vi.nextSegment.obj[prop]
будет отражено вvi.details.obj[prop]
. Если вы хотите совершенно новый объект, который является полностью отделены от оригинала, вам нужно будет сделать глубокую копию (passtrue
в качестве первого параметра):var vi.nextSegment = jQuery.extend(true, {}, vi.details);
чтобы узнать больше о расширении, см. здесь.
взгляните на пост: каков наиболее эффективный способ клонирования объекта javascript
по состоянию на Джон в отставку ответ:
// Shallow copy var newObject = jQuery.extend({}, oldObject); // Deep copy var newObject = jQuery.extend(true, {}, oldObject);
дополнительную информацию можно найти в документация по jQuery.
это работало лучше для меня клонирование объекта с помощью jQuery "parseJSON ()" и " JSON.преобразовать в строки()"
$.ajax({ url: 'ajax/test.html', dataType: 'json', success: function(data) { var objY = $.parseJSON(JSON.stringify(data)); var objX = $.parseJSON(JSON.stringify(data)); } });
клонирование объекта данных в objX & objY-это два разных объекта, вам не нужно возиться с проблемой "по ссылке"
Грасиас!
другой способ клонирования объекта -
newObj = JSON.parse(JSON.stringify(oldObj));
но будьте осторожны, если он содержит даты. формат JSON.разбор будет возвращать дату.метод toString() вместо даты в этом случае.
вот как я копирую элементы несколько раз:
сначала у меня есть шаблон:
<div class="forms-container"> <div class="form-template"> First Name <input> .. a lot of other data ... Last Name <input> <div> <button onclick="add_another();">Add another!</button> <div>
теперь, JavaScript:
function add_another(){ jQuery(".form-template").clone().appendTo(".forms-container"); }
попробовать
Immutable.js
:С
jQuery
в основном имеет дело сDOM Elements
, это не может быть правильным инструментом для работы.Immutable.js
это56 kb (minified)
библиотека созданный// roughly implementing import Immutable from 'immutable' // const oldObj = { foo: 'bar', bar: 'baz' } // create a map from the oldObj and then convert it to JS Object const newObj = Immutable.Map(oldObj).toJS()
таким образом, вы бы эффективно клонируются
newObj
СoldObj
. В принципе, если у вас нетMap
уже, тогда нам нужно создатьMap
первый. Карта похожа наblue-print
что мы работаем, чтобы создатьcopies
.ссылки :
дома -неизменяемые
Docs -Неизменяемые Документы
GitHub -Неизменяемый@GitHub
Удачи.