Ecco una rapida versione CoffeeScript in base al largo Matthew Crumley's answer (non ho usato includePrototype
come ho avuto alcun bisogno di esso):
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
e una versione unflatten base, che sarebbe senza dubbio fallire con separatori ripetuti e altri accorgimenti quali:
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, utilizzo queste funzioni per inserire i grafici degli oggetti in Redis hashes, che supportano solo una singola profondità di coppie chiave/valore.
fonte
2011-08-04 10:54:41
Perché ne hai bisogno? Vuoi elaborare i tuoi javascript durante il periodo di costruzione e le prestazioni di runtime js saranno migliorate? Ma come fareste ad accedere agli oggetti nidificati da js (dopo la compressione) se avete bisogno di operare con un modello di oggetti complesso (dove per esempio subobject (oggetto nidificato) deve passare come argomento ad una funzione)? –
Ho bisogno di questo per una mappatura dei dati in cui l'elaborazione non gestisce oggetti nidificati. – AnC
Ho avuto un simile bisogno di AnC quando uso oggetti nidificati con [Redis] (http://redis.io/commands#hash) in quanto supporta solo gli hash flat. Ho finito per usare una [versione di CoffeeScript] (http://stackoverflow.com/questions/963607/compressing-object-hierarchies-in-javascript/6940124#6940124) della [soluzione di Matthew Crumley] (http://stackoverflow.com/domande/963.607/compressione-oggetto-gerarchie-in-javascript/965315 # 965.315). –