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

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

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

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

6 ответов


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

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

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

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

вернутся:

{a:1, b:2}

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

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

вернутся:

{foo:'bar', test:123}

т. е. фактически клон.


в не jQuery способом.

var newObj = {};

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

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

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


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

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

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


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

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


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

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

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

мои 2 цента:

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

  return object;
}

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