J'ai un problème avec cette fonction qui traverse un hachage. Le hachage peut contenir un tableau de hachages. Je veux que la méthode recherche un identifiant puis retourne juste le hash imbriqué qu'il trouve.Traverser un hachage de manière récursive dans Ruby
Il semble fonctionner pour le traversal, mais il renvoie la valeur d'origine transmise.
require 'rubygems'
require 'ruby-debug'
def find_by_id(node, find_this="")
if node.is_a?(Hash)
node.each do |k,v|
if v.is_a?(Array)
v.each do |elm|
if elm["_id"] == find_this && !find_this.empty?
return elm # THIS IS WHAT I WANT!
else
find_by_id(elm, find_this)
end
end
end
end
end
end
x = {"name" => "first", "_id"=>'4c96a9a56f831b0eb9000005', "items"=>["name" => "second", "_id"=>'4c96a9af6f831b0eb9000009', "others"=>[{"name" => "third", "_id"=>'4c96a9af6f831b0eb9000007'}, {"name" => "fourth", "_id"=>'4c96a9af6f831b0eb9000008'}] ] }
find_by_id(x, '4c96a9af6f831b0eb9000008')
J'ai essayé cela, il renvoie la mauvaise valeur. 'return elm' est atteint quand il est supposé le faire. – Dex
@Dex: Droite. Vous devez également retourner zéro si vous ne trouvez rien. Edité pour ajouter cela. – sepp2k
Je tiens à souligner que ce n'est pas la récursion à blâmer, mais plutôt l'opérateur 'each', à l'intérieur duquel le dernier opérateur ne renvoie pas sa valeur de la fonction d'origine. –