Подтвердить что ты не робот

Как скопировать/клонировать хеш/объект в JQuery?

У меня есть простой объект (или хэш) в Javascript:

var settings = {
  link: 'http://example.com',
  photo: 'http://photos.com/me.jpg'
};

Мне нужна копия. Существует ли метод типа settings.clone(), который даст мне другой объект с теми же атрибутами? Я использую jQuery, так счастлив использовать утилиту jQuery, если таковой существует.

4b9b3361

Ответ 1

Да, extend пустой объект с оригинальным; Таким образом, все будет просто скопировано:

var clone = $.extend({}, settings);

Расширение некоторого заполненного объекта другим, например:

$.extend({a:1}, {b:2})

вернется:

{a:1, b:2}

С той же логикой:

$.extend({}, {foo:'bar', test:123})

вернется:

{foo:'bar', test:123}

то есть. эффективно клон.

Ответ 2

В режиме без jQuery.

var newObj = {};

Object.keys(settings).forEach(function(key) {
     newObj[ key ] = settings[ key ];
}); 

Это копирует только свойства верхнего уровня. Чтобы скопировать хеши с вложенными объектами в качестве значений свойств, вам нужно будет использовать рекурсивную функцию.

NB: Object.keys(settings) избегает необходимости вызова settings.hasOwnProperty(key).

Ответ 3

var clone = $.extend(true, {}, settings);

Задайте первый аргумент true.

EDIT: Первый аргумент true означает глубокую копию. Для данного примера в оригинальном вопросе нет необходимости в глубокой копии, так как существуют простые неизменные пары ключ-значение. Для вопроса в заголовке - в общем случае - используйте глубокую копию. В противном случае вы получите полукруг.

Ответ 4

Похоже, вы хотите расширить jQuery, который может скопировать объект для вас.

http://api.jquery.com/jQuery.extend/

Ответ 5

Underscore.js также имеет функцию расширения, если вы не используете jQuery:

expand _.extend(destination, *sources) Скопируйте все свойства исходных объектов поверх целевого объекта и вернуть объект назначения. Он в порядке, поэтому последний источник будет переопределяет свойства с тем же именем в предыдущих аргументах.

_.extend({name: 'moe'}, {age: 50});
=> {name: 'moe', age: 50}

Ответ 6

Мои 2 цента:

function clone(hash) {
  var json = JSON.stringify(hash);
  var object = JSON.parse(json);

  return object;
}

Он может быть не самым оптимизированным вариантом, но может быть удобным для некоторых сценариев.