Вот быстрый CoffeeScript версия, основанная от Matthew Crumley's answer (я не использовал includePrototype
, как у меня не было никакой потребности в ней):
flatten = (obj, into = {}, prefix = '', sep = '_') ->
for own key, prop of obj
if typeof prop is 'object' and prop not instanceof Date and prop not instanceof RegExp
flatten prop, into, prefix + key + sep, sep
else
into[prefix + key] = prop
into
и основная unflatten версия, которая, несомненно, потерпит неудачу с повторными сепараторов и других подобных trickiness:
unflatten = (obj, into = {}, sep = '_') ->
for own key, prop of obj
subKeys = key.split sep
sub = into
sub = (sub[subKey] or= {}) for subKey in subKeys[...-1]
sub[subKeys.pop()] = prop
into
FWIW, я использую эти функции для точечного отображения графов объектов в Redis hashes, которые поддерживают только одну пару пар ключ/значение.
Зачем вам это нужно? Вы хотите обработать ваши javascripts во время сборки, а затем производительность js будет улучшена? Но как бы вы могли получить доступ к вложенным объектам из js (после сжатия), если вам нужно работать со сложной объектной моделью (где, например, подобъект (вложенный объект) должен проходить как аргумент некоторой функции)? –
Мне нужно это для отображения данных, где обработка не обрабатывает вложенные объекты. – AnC
У меня была аналогичная потребность в AnC при использовании вложенных объектов с помощью [Redis] (http://redis.io/commands#hash), поскольку она поддерживает только плоские хэши. Я закончил с использованием [CoffeeScript-версии] (http://stackoverflow.com/questions/963607/compressing-object-hierarchies-in-javascript/6940124#6940124) из [решения Мэтью Крамли] (http://stackoverflow.com/вопросы/963607/сжатия-объектные иерархии-в-JavaScript/965315 # 965315). –