Рекурсия есть:
const objectParser = (data, path = '') =>
Object.assign(
{ [path || '<root>']: data },
...(data instanceof Object
? Object.entries(data).map(([ k, v ]) => objectParser(v, `${path}[${k}]`))
: []
)
);
Рекурсии нет:
function objectParser(data) {
const result = {};
for (const stack = [ [ data, '' ] ]; stack.length;) {
const [ n, path ] = stack.pop();
result[path || '<root>'] = n;
(n instanceof Object) && Object
.entries(n)
.reverse()
.forEach(([ k, v ]) => stack.push([ v, `${path}[${k}]` ]));
}
return result;
}