2013-07-24 5 views
2

Je suis la restructuration d'un objet en javascript pour transformer un objet plat:Quelle est la meilleure façon de restructurer un objet javascript?

{ 
    'we' : 'are', 
    'the' : 'knights', 
    'who' : 'say', 
    'ni' : '!!!' 
} 

dans un objet dans lequel certains des éléments précédemment dans l'objet plat sont contenus dans un enfant de l'objet plat d'origine:

{ 
    'we' : 'are', 
    'the' : 'knights', 
    'shrubbery' : { 
     'who' : 'say', 
     'ni' : '!!!' 
    } 
} 

Je peux faire cette restructuration en faisant référence à une suppression puis, comme ceci:

var knights = { 
    'we' : 'are', 
    'the' : 'knights', 
    'who' : 'say', 
    'ni' : '!!!' 
}; 

knights.shrubbery = {'who':knights.who, 
        'ni':knights.ni}; 

delete knights.who; 
delete knights.ni; 

mais cela semble inélégant. Existe-t-il un meilleur moyen de déplacer les attributs d'un objet vers un objet différent ou de regrouper autrement les attributs d'un objet dans un enfant de cet objet? En fin de compte, ce que j'essaie de faire est de former un objet plat dans un arbre de données, dans lequel l'objet racine peut contenir des groupes qui contiennent des sous-groupes et ainsi de suite. Quelque chose comme tourner ceci:

{'leaf1':'', 
'leaf2':'', 
'leaf3':'', 
'leaf4':'', 
'leaf5':'', 
'leaf6':'', 
'leaf7':'', 
'leaf8':'', 
'leaf9':'' 
} 

dans ce:

{'leaf1':'', 
'leaf2':'', 
'leaf3':'', 
'groups' : [ 
    { 
     'leaf1':'' 
    },{ 
    'leaf1':'', 
    'leaf2':'', 
    'groups':[ 
     { 
     'leaf7':'', 
     'leaf8':'', 
     'leaf9':'' 
     } 
    ] 
    } 
] 
} 
+1

Pouvez-vous donner un exemple dans quel contexte vous essayez de le faire? La question en ce moment est fortement basée sur l'opinion. –

+1

Pourquoi est-ce inélégant? Vous pouvez simplement déplacer ceci dans une fonction qui accepte les paramètres et utilise ces paramètres au lieu de coder en dur les valeurs, mais cela aboutirait à la même chose. – Ian

+0

Je suis juste habitué à 'jquery.append', où je peux ajouter un élément DOM à un autre et l'élément n'existe plus dans son emplacement d'origine. Je me demandais s'il y avait quelque chose de similaire en javascript pour déplacer les attributs. – ckersch

Répondre

1

Je ne pense pas qu'il y ait quelque chose de mal avec votre méthode actuelle, mais pour le rendre un peu plus extensible que vous pouvez envelopper dans un fonction:

function restructure(obj, new_child, properties) { 
    obj[new_child] = {}; 
    for (var i = 0; i < properties.length; i++) { 
     obj[new_child][properties[i]] = obj[properties[i]]; 
     delete obj[properties[i]]; 
    } 
} 

restructure(knights, 'shrubbery', ['who', 'ni']); 
+0

A fini par faire quelque chose de similaire; J'ai étendu la classe Object avec une nouvelle méthode qui ferait l'ajout pour moi. 'Object.prototype.appendAttrTo = fonction (attr, cible) {target [attr] = this [attr]; supprimer cette [attr]}' – ckersch

1

Je suggère d'écrire une méthode pour faire quelque chose comme ça dans le cas général. Je ne recommanderais pas de faire muter l'objet en place, simplement parce que, plus souvent qu'autrement, vous en aurez plus à utiliser un qui crée une copie à la place.

est ici une idée: que diriez-vous de la signature de la méthode prend:

  1. Un objet
  2. Un nom de propriété
  3. Une liste de noms de propriété nicher dans la nouvelle propriété

Comme ceci:

function nestProperties(obj, property, nestedProperties) 
{ 
    var newObj = {}; 
    var nestedObj = {}; 

    for (var i = 0; i < nestedProperties.length; ++i) 
    { 
    if (nestedProperties[i] in obj) 
    { 
     nestedObj[nestedProperties[i]] = obj[nestedProperties[i]]; 
    } 
    } 

    for (var k in obj) 
    { 
    if (!(k in nestedObj)) 
    { 
     newObj[k] = obj[k]; 
    } 
    } 

    newObj[property] = nestedObj; 

    return newObj; 
} 

Vous utiliseriez ceci comme ceci:

var flat = { 
    'we' : 'are', 
    'the' : 'knights', 
    'who' : 'say', 
    'ni' : '!!!' 
}; 

var knights = nestProperties(flat, 'shrubbery', ['who', 'ni']); 
Questions connexes