Объект глубокого копирования Javascript
Возможный дубликат:
Каков наиболее эффективный способ клонирования объекта JavaScript?
У меня есть такой объект:
User = {
name: "user",
settings: {
first: "1",
second: "2"
}
}
и второй:
user1 = {
name: "user1",
settings: {
second: "3"
}
}
теперь я хочу скопировать пользовательские значения user1 в User, используя:
for(var key in user1){
User[key] = user1[key];
}
Результат Пользователь будет:
User = {
name: "user1",
settings: {
second: "3"
}
}
Пользовательские настройки были полностью заменены, пока я хотел установить только параметры. Вторая замена.
Как достичь этого, не зная, сколько дочернего объекта имеет основной объект?
Ответы
Ответ 1
Я нашел, что лучший способ - это:
http://andrewdupont.net/2009/08/28/deep-extending-objects-in-javascript/
Object.deepExtend = function(destination, source) {
for (var property in source) {
if (typeof source[property] === "object" &&
source[property] !== null ) {
destination[property] = destination[property] || {};
arguments.callee(destination[property], source[property]);
} else {
destination[property] = source[property];
}
}
return destination;
};
Object.extend(destination, source);
Как насчет этого?
function clone(destination, source) {
for (var property in source) {
if (typeof source[property] === "object" && source[property] !== null && destination[property]) {
clone(destination[property], source[property]);
} else {
destination[property] = source[property];
}
}
};
Ответ 2
Ухватил jQuery метод расширения и сделал его агностиком библиотеки.
Gist: Библиотека агностической версии jQuery Extend
Его завернутый в конструктор Extender, поэтому вам не нужно создавать экземпляры
все его внутренние методы каждый раз, когда вы вызываете метод extend.
Отказ от ответственности: я не тестировал это широко. Это в основном клон 1:1 jQuery extend(), однако ваш пробег может меняться.
Используйте его так.
var user1 = {
name: "user1",
settings: {
first: "1",
second: {bar: 'foo'}
}
};
var user2 = {
name: "user2",
settings: {
second: {foo:'bar'}
}
};
/* merge user1 into User */
__extend(true, user1, user2);
// Modifies the User object
user1.settings.second.foo == 'bar'; // true
// note, you can do assignment too.
var newUser = __extend(true, user1, user2);
Подробнее см. здесь
Ответ 3
Это действительно тяжело, но это должно сработать. Я предлагаю сделать, как другие пользователи предложили в комментариях; найдите уже существующую библиотеку, которая сделает это за вас.
for(var key in user1){
var temp = User[key]
User[key] = user1[key];
for(var key1 in temp){
if(User[key][key1] == null){
User[key][key1] = temp[key1];
}
}
}