Voici une version CoffeeScript rapide basée hors Matthew Crumley's answer (je n'ai pas utilisé includePrototype
comme je l'avais pas besoin pour cela):
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
et une version Redresser de base, ce qui serait sans doute échouer avec des séparateurs répétés et d'autres tels rouerie:
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, j'utilise ces fonctions pour pousser les graphiques d'objet dans Redis hashes, qui ne supportent qu'une seule profondeur de paires clé/valeur.
Pourquoi auriez-vous besoin de cela? Souhaitez-vous traiter vos javascripts pendant la compilation, puis les performances de js seront améliorées? Mais comment accèderiez-vous aux objets imbriqués à partir de votre js (après compression) si vous devez opérer avec un modèle d'objet complexe (où par exemple subobject (objet imbriqué) doit passer en argument à une fonction)? –
J'ai besoin de cela pour un mappage de données où le traitement ne gère pas les objets imbriqués. – AnC
J'avais un besoin similaire à AnC lors de l'utilisation d'objets imbriqués avec [Redis] (http://redis.io/commands#hash) car il ne supporte que les hachages plats. J'ai fini par utiliser une [version de CoffeeScript] (http://stackoverflow.com/questions/963607/compressing-object-hierarchies-in-javascript/6940124#6940124) de [la solution de Matthew Crumley] (http://stackoverflow.com/questions/963607/compression-object-hierarchies-in-javascript/965315 # 965315). –