Правильно понимаю, что массивы обрабатывать не надо? Т.е.,
const isObject = v =>
v instanceof Object && !Array.isArray(v);
Рекурсия есть:
const flatObj = obj => Object
.entries(isObject(obj) ? obj : {})
.reduce((acc, [ k, v ]) => (
isObject(v)
? Object.assign(acc, flatObj(v))
: acc[k] = v,
acc
), {});
Рекурсии нет:
function flatObj(obj) {
const result = {};
for (const stack = isObject(obj) ? [ [ , obj ] ] : []; stack.length;) {
const [ k, v ] = stack.pop();
if (isObject(v)) {
stack.push(...Object.entries(v).reverse());
} else {
result[k] = v;
}
}
return result;
}