стоит разобраться с методом массива
reduce()
Upd.
reduce() выполнится для каждой буквы: a, b, c и d.
В функцию аргументом
i попадает очередная буква.
Аргументом
part первый раз туда попадает пустой объект
obj. И ссылка на него сохраняется - её и вернём как результат.
Внутри
reduce функцию можно так переписать, делает то же самое:
function (part, i) {
const empty = {}; // новая матрёшка
part[i] = empty; // вложили её в предыдущую
return empty; // новая матрёшка станет part'ом при следующем вызове
}