73 lines
2.2 KiB
JavaScript
73 lines
2.2 KiB
JavaScript
function Состояние()
|
|
{
|
|
this.создать = function()
|
|
{
|
|
this.обработчик = null;
|
|
this.значения = {};
|
|
};
|
|
|
|
this.выпрямить = function(obj)
|
|
{
|
|
// https://stackoverflow.com/a/42121920
|
|
var newObj = {};
|
|
for (var key in obj)
|
|
{
|
|
if (typeof obj[key] === 'object' && obj[key] !== null)
|
|
{
|
|
var temp = this.выпрямить(obj[key])
|
|
for (var key2 in temp)
|
|
{
|
|
newObj[key + "." + key2] = temp[key2];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
newObj[key] = obj[key];
|
|
}
|
|
}
|
|
return newObj;
|
|
};
|
|
|
|
this.лишьНовыеЗначения = function(значения)
|
|
{
|
|
var новые = {};
|
|
for (var ключ in значения)
|
|
{
|
|
var было = this.значения[ключ];
|
|
var стало = значения[ключ];
|
|
if (!(было != null && было == стало))
|
|
{
|
|
новые[ключ] = стало;
|
|
}
|
|
}
|
|
return новые;
|
|
};
|
|
|
|
this.разобрать = function(словарь)
|
|
{
|
|
this.разобратьВыпрямленный(this.выпрямить(словарь));
|
|
};
|
|
|
|
this.разобратьВыпрямленный = function(выпрямленныйСловарь)
|
|
{
|
|
for (var ключ in выпрямленныйСловарь)
|
|
{
|
|
let путь = ключ.split(".");
|
|
let значение = выпрямленныйСловарь[ключ];
|
|
if (this.обработчик)
|
|
{
|
|
this.обработчик(ключ, путь, значение);
|
|
}
|
|
this.значения[ключ] = значение;
|
|
}
|
|
};
|
|
|
|
this.разобратьЛишьНовое = function(словарь)
|
|
{
|
|
this.разобратьВыпрямленный(this.лишьНовыеЗначения(this.выпрямить(словарь)));
|
|
};
|
|
|
|
// Конструктор.
|
|
this.создать();
|
|
}
|