Вы можете использовать Object.entries , Array.prototype.flatMap и Object.fromEntries
const upperFirst = (str = "") =>
str[0] .toUpperCase () + str.substr(1)
const camelCase = ([ first = "", ...rest ]) =>
first + rest .map (upperFirst) .join ('')
const append = (xs, x) =>
xs .concat ([ x ])
const flatten = (o = {}) =>
{ const loop = (o, path) =>
Object (o) === o
? Object .entries (o) .flatMap
( ([ k, v ]) =>
loop
( v
, append (path, k)
)
)
: [ [ camelCase (path), o ] ]
return Object .fromEntries (loop (o, []))
}
console.log
( flatten
( { name: "John"
, school:
{ name: "Phillips"
, district: { zone: 1 }
}
}
)
)
// { "name": "John"
// , "schoolName": "Phillips"
// , "schoolDistrictZone": 1
// }
flatMap
охотно оценивает ввод и создает некоторые промежуточные значения, прежде чем flatten
сможет вернуться. Поскольку Object.fromEntries
принимает любую итерацию, нам, вероятно, лучше написать loop
с генератором
const flatten = (o = {}) =>
{ const loop = function* (o, path)
{ if (Object (o) === o)
for (const [ k, v ] of Object .entries (o))
yield* loop
( v
, append (path, k)
)
else
yield [ camelCase (path), o ]
}
return Object .fromEntries (loop (o, []))
}
Перезапустите программу, и вы увидите точно такой же вывод. Также стоит упомянуть структурное сходство двух программ.