Клонирование объекта в JavaScript - PullRequest
63 голосов
/ 19 марта 2011

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

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

Ответы [ 6 ]

128 голосов
/ 19 марта 2011

Чтобы клонировать объект в 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);

Чтобы узнать больше о расширении, см. здесь.

31 голосов
/ 19 марта 2011

Взгляните на пост: Какой самый эффективный способ клонировать объект JavaScript

Согласно Джона Ресига ответ:

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

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

Дополнительную информацию можно найти в документации jQuery.

8 голосов
/ 21 марта 2011

Это сработало лучше для меня, клонируя объект с помощью 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!

6 голосов
/ 24 сентября 2015

Еще один способ клонирования объекта -

newObj = JSON.parse(JSON.stringify(oldObj));

Но будьте осторожны, если он содержит даты. В этом случае JSON.parse вернет date.toString () вместо date.

3 голосов
/ 11 апреля 2015

Вот как я копирую элементы несколько раз:

Сначала у меня есть шаблон:

<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");
}
2 голосов
/ 08 февраля 2017

Попробуйте 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.

Ссылки:

Home - Неизменные

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

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

Удачи.

...