Сравнить свойства двух объектов 
		
		
		
		Доброго времени суток. есть два объекта, defaults и param. Первый содержит кучу свойств, второй изначально имеет только часть свойств первого. Как сделать так чтобы свойства первого, которых нет у второго присваивались второму со значениями. Пробовал такой вариант, но появляются только свойства, без значений. 
	
for(var s in defaults){param[s]=(param[s]!='undefined')?param[s]:defaults[s];}
 | 
	
		
 Проще всего через наследование. Просто кладете дефолтный объект в прототип и пихаете свои значения сверху.  
	Второй способ - рекурсивно. 
//Тестовые данные
var defaults = {
    test1: true,
    test2: true,
    test3: {
        "test3.1": true,
        "test3.2": true
    }
};
var params = {
    test2: false,
    test3: {
        "test3.2": false
    }
};
//Сама маржилка
var result = (function (defaults, param) {
    var obj = Object.create(defaults);
    var merge = function (result, params) {
        for (var key in params) {
            if (params.hasOwnProperty(key)) {
                if (key in result && typeof params[key] == "object" && typeof result[key] == "object") {
                    merge(result[key], params[key])
                } else {
                    result[key] = params[key];
                }
            }
        }
    };
    merge(obj, params);
    return obj;
})(defaults, params);
//проверяем
alert(result.test1);
alert(result.test2);
alert(result.test3["test3.1"]);
alert(result.test3["test3.2"]);
 | 
	
		
 Блин, как то мудрёно, понять не могу как работает. А можете подсказать, почему моя то не работает? Точнее на половину 
	 | 
	
		
 vanoha, потому что Вы не правильно делаете проверку на undefined, в Вашем случае Вы пытаетесь сравнить со строкой "undefined". 
	Проще так: 
for(var s in defaults){
    param[s] = param[s] || defaults[s];
}
Ну а если именно на undefined, то: 
for(var s in defaults){
    if(!(s in param)) param[s] = defaults[s];
}
 | 
	
		
 Дело в том что функция должна быть рекурсивная, чтобы она проходила не только по списку ключей но и по вложенным объектам. 
	Я поправил свой пример.  | 
	
		
 Руслан, было бы супер, если бы ваш второй вариант работал 
	 | 
	
		
 vanoha, 
	В вашем варианте объект test3 перезапишется, а в моём - смержится.  | 
	
		
 tsigel, ваш скрипт ещё запутаннее для меня стал... 
	 | 
	
		
 vanoha, 
	Сначала я создаю объект в прототип которого кладу ваши дефолтные данные. Потом я перебираю объект параметров. Если элемент объект и в дефолтных данных есть объект с таким ключем - мерджим объект, в противном случае присваиваем в результат элемент из объекта параметров.  | 
	
		
 vanoha, извиняюсь, s в param была лишней, поправил. 
	 | 
| Часовой пояс GMT +3, время: 05:37. |