Как скопировать / клонировать хеш / объект в JQuery? - PullRequest
37 голосов
/ 19 августа 2011

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

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

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

Ответы [ 6 ]

61 голосов
/ 19 августа 2011

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

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

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

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

вернет:

{a:1, b:2}

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

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

вернет:

{foo:'bar', test:123}

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

32 голосов
/ 19 августа 2011

Не jQuery.

var newObj = {};

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

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

Примечание: Object.keys(settings) избавляет от необходимости звонить settings.hasOwnProperty(key).

4 голосов
/ 11 августа 2015
var clone = $.extend(true, {}, settings);

Установить для первого аргумента значение true.

РЕДАКТИРОВАТЬ: Первый аргумент true означает глубокое копирование.Для данного примера в исходном вопросе нет необходимости в глубоком копировании, поскольку существуют простые неизменяемые пары ключ-значение.Для вопроса в заголовке - в общем случае - используйте глубокую копию.В противном случае вы получите половинную копию.

2 голосов
/ 19 августа 2011

Звучит так, будто вы хотите jQuery extension, которое может скопировать объект для вас.

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

1 голос
/ 02 марта 2016

Мои 2 цента:

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

  return object;
}

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

1 голос
/ 01 мая 2013

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

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

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