Как скопировать/клонировать хеш/объект в JQuery?
У меня есть простой объект (или хэш) в Javascript:
var settings = {
link: 'http://example.com',
photo: 'http://photos.com/me.jpg'
};
Мне нужна копия. Существует ли метод типа settings.clone()
, который даст мне другой объект с теми же атрибутами? Я использую jQuery, так счастлив использовать утилиту jQuery, если таковой существует.
Ответы
Ответ 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;
}
Он может быть не самым оптимизированным вариантом, но может быть удобным для некоторых сценариев.