Itérer sur une profondément imbriqués niveau de hachages en Ruby
J'ai donc une table de hachage, et pour chaque niveau de la table de hachage, je veux le ranger sa clé et la valeur. Le problème est, une valeur peut être un autre tableau de hachage. En outre, le hash peut contenir des paires clé-valeur où la valeur est encore un autre tableau de hachage, etc, etc. Aussi, je ne sais pas comment profondément imbriqués chaque hachage sera. Pour donner un exemple:
{
:key1 => 'value1',
:key2 => 'value2',
:key3 => {
:key4 => 'value4',
:key5 => 'value5'
},
:key6 => {
:key7 => 'value7',
:key8 => {
:key9 => 'value9'
}
}
}
..Et ainsi de suite. Ce que je veux faire est d'enregistrer chaque touche, la valeur de la paire et de l'id de son parent. I figure ce sera probablement fait de manière récursive, je suis juste pas comment parce que je suis familier avec les fonctions récursives. Je sais comment parcourir les données normalement:
myHash.each {|key, value|
...Do something with the key and value ...
}
Et donc je suppose que l'appel récursif sera quelque chose comme ceci:
def save_pair (myHash)
myHash.each {|key, value|
if(value.class != Hash) ? Pair.create(key, value) : save_pair(value)
}
end
Ce n'est pas testé, et je ne sais toujours pas comment intégrer sauver le parent id indépendamment.
Vous devez vous connecter pour publier un commentaire.
Si je comprends l'objectif, alors vous devriez être en mesure de passer dans le parent de votre méthode de sauvegarde. Pour le haut niveau, il sera nul. Le tableau suivant illustre l'idée selon laquelle
puts
est utilisé en tant que titulaire de place pour le "sauver".Voici un exemple de l'appel à elle:
Je sais que c'est une réponse tardive, mais j'ai juste mis en place une non-récursive solution à votre problème et de la pensée, c'est le partage de la valeur.
Alors, pour en revenir à votre problème, vous pouvez le faire:
Il y a aussi un gist version.
object.respond_to? :each
oumy_object.class.include? Enumerable
peut être utilisé avec moins de hachage modification spécifique.v.each_with_parent(k, &blk)
et en faisant p[k] = c. to_i l'intérieur de la boucle. J'ai essayé de reformater au format json (changer les cordes pour les booléens/les entiers).Ici est récursive (lire amélioration de la) version de
Hash::each
(Hash::each_pair
) avec bloc et énumérateur support:Ici l'utilisation exemples de
Hash::each
avec et sansrecursive
drapeau:Ici est un exemple de la question elle-même:
Également prendre un coup d'oeil à ma version récursive de
Hash::merge
(Hash::merge!
) ici.Je vous conseille d'utiliser #deep_locate de hashie gem
https://www.rubydoc.info/github/intridea/hashie/Hashie/Extensions/DeepLocate#deep_locate-instance_method
peu hacky toujours return false pas à la recherche de
Avez-vous essayé quelque chose comme ça?
Il doit faire pour JSON bien. Des améliorations mineures à la Marque de code où il convertit tout en majuscules dans une donnée de hachage: