Как скопировать / клонировать хэш / объект в 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. В противном случае вы получите половину копии.
подчеркивания.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;
}
это может быть не самый оптимизированный вариант, но он может быть удобен для некоторых сценариев.