Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.12.2014, 12:02
Аспирант
Отправить личное сообщение для vanoha Посмотреть профиль Найти все сообщения от vanoha
 
Регистрация: 15.11.2014
Сообщений: 53

Сравнить свойства двух объектов
Доброго времени суток. есть два объекта, defaults и param. Первый содержит кучу свойств, второй изначально имеет только часть свойств первого. Как сделать так чтобы свойства первого, которых нет у второго присваивались второму со значениями. Пробовал такой вариант, но появляются только свойства, без значений.
for(var s in defaults){param[s]=(param[s]!='undefined')?param[s]:defaults[s];}
Ответить с цитированием
  #2 (permalink)  
Старый 01.12.2014, 12:11
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Проще всего через наследование. Просто кладете дефолтный объект в прототип и пихаете свои значения сверху.
Второй способ - рекурсивно.

//Тестовые данные
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"]);

Последний раз редактировалось tsigel, 01.12.2014 в 12:48.
Ответить с цитированием
  #3 (permalink)  
Старый 01.12.2014, 12:20
Аспирант
Отправить личное сообщение для vanoha Посмотреть профиль Найти все сообщения от vanoha
 
Регистрация: 15.11.2014
Сообщений: 53

Блин, как то мудрёно, понять не могу как работает. А можете подсказать, почему моя то не работает? Точнее на половину
Ответить с цитированием
  #4 (permalink)  
Старый 01.12.2014, 12:34
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

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];
}

Последний раз редактировалось ruslan_mart, 01.12.2014 в 12:55.
Ответить с цитированием
  #5 (permalink)  
Старый 01.12.2014, 12:39
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Дело в том что функция должна быть рекурсивная, чтобы она проходила не только по списку ключей но и по вложенным объектам.

Я поправил свой пример.
Ответить с цитированием
  #6 (permalink)  
Старый 01.12.2014, 12:46
Аспирант
Отправить личное сообщение для vanoha Посмотреть профиль Найти все сообщения от vanoha
 
Регистрация: 15.11.2014
Сообщений: 53

Руслан, было бы супер, если бы ваш второй вариант работал
Ответить с цитированием
  #7 (permalink)  
Старый 01.12.2014, 12:46
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

vanoha,
В вашем варианте объект test3 перезапишется, а в моём - смержится.
Ответить с цитированием
  #8 (permalink)  
Старый 01.12.2014, 12:47
Аспирант
Отправить личное сообщение для vanoha Посмотреть профиль Найти все сообщения от vanoha
 
Регистрация: 15.11.2014
Сообщений: 53

tsigel, ваш скрипт ещё запутаннее для меня стал...
Ответить с цитированием
  #9 (permalink)  
Старый 01.12.2014, 12:51
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

vanoha,
Сначала я создаю объект в прототип которого кладу ваши дефолтные данные.

Потом я перебираю объект параметров. Если элемент объект и в дефолтных данных есть объект с таким ключем - мерджим объект, в противном случае присваиваем в результат элемент из объекта параметров.

Последний раз редактировалось tsigel, 01.12.2014 в 12:53.
Ответить с цитированием
  #10 (permalink)  
Старый 01.12.2014, 12:55
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

vanoha, извиняюсь, s в param была лишней, поправил.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Селектор из двух объектов переменными gearique jQuery 4 13.06.2013 19:31
Создание своей библиотеки. Создание двух одинаковых объектов. Как избежать? IDCh Javascript под браузер 2 31.10.2012 12:53
клонирование двух разных объектов на 1 страницы angel__2003 jQuery 1 16.10.2012 19:40
Как найти точки соприкосновения двух объектов в RaphaelJS Fatalityap Библиотеки/Тулкиты/Фреймворки 3 03.08.2012 16:33
как создавать динамически свойства объектов kichSman Общие вопросы Javascript 0 11.04.2012 21:52