Подтвердить что ты не робот

Объект глубокого копирования 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"
  }
}

Пользовательские настройки были полностью заменены, пока я хотел установить только параметры. Вторая замена.

Как достичь этого, не зная, сколько дочернего объекта имеет основной объект?

4b9b3361

Ответ 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];
      }
   }
}