77 lines
2.6 KiB
JavaScript
77 lines
2.6 KiB
JavaScript
мир = {
|
|
ключники: [],
|
|
выставленныеЗначения: {},
|
|
};
|
|
|
|
мир.выпрямить = 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(".");
|
|
var пройти = путь.length - 1;
|
|
var вложенность = словарь;
|
|
for (var номер = 0; номер < пройти; ++номер)
|
|
{
|
|
var внутреннийКлюч = путь[номер];
|
|
console.debug("проход номер/внутреннийКлюч/путь", номер, внутреннийКлюч, путь);
|
|
var внутреннийСловарь = вложенность[внутреннийКлюч];
|
|
if (!внутреннийСловарь)
|
|
{
|
|
вложенность[внутреннийКлюч] = {};
|
|
внутреннийСловарь = вложенность[внутреннийКлюч];
|
|
вложенность = внутреннийСловарь;
|
|
}
|
|
}
|
|
// Значение в конце пути.
|
|
{
|
|
вложенность[путь[пройти]] = значение;
|
|
}
|
|
};
|