Aquí está basada una versión rápida CoffeeScript fuera Matthew Crumley's answer (yo no uso includePrototype
ya que no tenía necesidad de él):
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
y una versión básica unflatten, lo que sin duda fallar con repetidos separadores y otros tales astucia:
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, utilizo estas funciones para insertar gráficos de objetos en Redis hashes, que solo admiten una profundidad única de pares clave/valor.
¿Por qué necesitarías eso? ¿Desea procesar sus javascripts durante el tiempo de compilación y luego se mejorará el rendimiento de js en tiempo de ejecución? Pero, ¿cómo accedería a los objetos anidados desde su js (después de la compresión) si necesita operar con un modelo de objetos complejo (donde, por ejemplo, subobjeto (objeto anidado) tiene que pasar como argumento para alguna función)? –
Necesito esto para una asignación de datos donde el procesamiento no maneja objetos anidados. – AnC
Tenía una necesidad similar a AnC al usar objetos anidados con [Redis] (http://redis.io/commands#hash) ya que solo admite hash planos. Terminé usando una [versión de CoffeeScript] (http://stackoverflow.com/questions/963607/compressing-object-hierarchies-in-javascript/6940124#6940124) de [la solución de Matthew Crumley] (http://stackoverflow.com/questions/963607/compressing-object-hierarchies-in-javascript/965315 # 965315). –