Ниже первые журналы 0, а затем журналы 1. Как сохранить копию объекта, а не ссылку на него?
debug.log(vi.details.segment);
vi.nextSegment = vi.details;
vi.nextSegment.segment++;
debug.log(vi.details.segment);
Ниже первые журналы 0, а затем журналы 1. Как сохранить копию объекта, а не ссылку на него?
debug.log(vi.details.segment);
vi.nextSegment = vi.details;
vi.nextSegment.segment++;
debug.log(vi.details.segment);
Чтобы клонировать объект в jQuery:
var vi.nextSegment = jQuery.extend({}, vi.details);
ПРИМЕЧАНИЕ. Вышеупомянутая информация представляет собой мелкую копию: любые вложенные объекты или массивы будут скопированы по ссылке - это означает, что любые изменения, внесенные вами в vi.nextSegment.obj[prop]
, будут отражены в vi.details.obj[prop]
. Если вы хотите совершенно новый объект, который полностью отделен от оригинала, вам нужно сделать глубокую копию (передать true
в качестве первого параметра):
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.stringify()"
$.ajax({
url: 'ajax/test.html',
dataType: 'json',
success: function(data) {
var objY = $.parseJSON(JSON.stringify(data));
var objX = $.parseJSON(JSON.stringify(data));
}
});
Объект клонирования данных в objX и objY - это два разных объекта, вам не нужно испортить проблему "по ссылке"
Gracias!
Другой способ клонирования объекта -
newObj = JSON.parse(JSON.stringify(oldObj));
Но будьте осторожны, если он содержит даты. В этом случае JSON.parse вернет date.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)
, созданная Facebook
.
// 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
.
Главная - Immutable
Документы - Неизменяемые документы
GitHub - Immutable @GitHub
Удачи.