Клонирование объекта в javascript


ниже сначала регистрирует 0, а затем регистрирует 1. Как сохранить копию объекта, а не ссылку на него?

debug.log(vi.details.segment);
vi.nextSegment = vi.details;
vi.nextSegment.segment++;
debug.log(vi.details.segment);
6 58

6 ответов:

для клонирования объекта в jQuery:

var vi.nextSegment = jQuery.extend({}, vi.details);

Примечание: вышеописанное является мелкой копией: любые вложенные объекты или массивы будут скопированы по ссылке-это означает любые изменения, которые вы вносите в vi.nextSegment.obj[prop] будет отражено в vi.details.obj[prop]. Если вы хотите совершенно новый объект, который является полностью отделены от оригинала, вам нужно будет сделать глубокую копию (pass 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.преобразовать в строки()"

$.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) библиотека созданный 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.

ссылки :

дома -неизменяемые

Docs -Неизменяемые Документы

GitHub -Неизменяемый@GitHub

Удачи.