мир = { ключники: [], выставленныеЗначения: {}, }; мир.выпрямить = function(obj) { // https://stackoverflow.com/a/42121920 var newObj = {}; for (var key in obj) { if (typeof obj[key] === 'object' && obj[key] !== null) { var temp = мир.выпрямить(obj[key]) for (var key2 in temp) { newObj[key + "." + key2] = temp[key2]; } } else { newObj[key] = obj[key]; } } return newObj; }; мир.лишьНовыеЗначения = function(значения) { var новые = {}; for (var ключ in значения) { var было = мир.выставленныеЗначения[ключ]; var стало = значения[ключ]; if (!(было != null && было == стало)) { новые[ключ] = стало; мир.выставленныеЗначения[ключ] = стало; } } return новые; }; мир.разобрать = function(словарь) { var значения = мир.лишьНовыеЗначения(мир.выпрямить(словарь)); for (var ключ in значения) { var путь = ключ.split("."); var значение = значения[ключ]; for (var номер in мир.ключники) { мир.ключники[номер](ключ, путь, значение); } } }; мир.задать = function(словарь, ключ, значение) { var путь = ключ.split("."); if (путь.length == 1) { словарь[ключ] = значение; } else { var пройти = путь.length - 1; var вложенность = словарь; for (var номер = 0; номер < пройти; ++номер) { var внутреннийКлюч = путь[номер]; console.debug("проход номер/внутреннийКлюч", номер, внутреннийКлюч); var внутреннийСловарь = вложенность[внутреннийКлюч]; if (!внутреннийСловарь) { вложенность[внутреннийКлюч] = {}; внутреннийСловарь = вложенность[внутреннийКлюч]; вложенность = внутреннийСловарь; } } } };