Я пытаюсь построить функцию, которая бы расширяла объект типа :
{
'ab.cd.e' : 'foo',
'ab.cd.f' : 'bar',
'ab.g' : 'foo2'
}
Во вложенный объект :
{ab: {cd: {e:'foo', f:'bar'}, g:'foo2'}}
Как эта функция php : Set::expand()
Без использования eval конечно.
Вы могли разделить строку ключа как путь и уменьшить его для присвоения значения при помощи объекта по умолчанию для непосещаемых уровней.
function setValue(object, path, value) {
var keys = path.split('.'),
last = keys.pop();
keys.reduce((o, k) => o[k] = o[k] || {}, object)[last] = value;
return object;
}
var source = { 'ab.cd.e': 'foo', 'ab.cd.f': 'bar', 'ab.g': 'foo2' },
target = Object
.entries(source)
.reduce((o, [k, v]) => setValue(o, k, v), {});
console.log(target);