def return_path(arr, value, path=[])
ndx = arr.index(value)
return path + [ndx] unless ndx.nil?
arr.each_with_index do |o,i|
next unless o.is_a?(Hash)
o.each do |k,v|
next unless v.is_a?(Array)
path = return_path(v, value, path+[i,k])
return path unless path.nil?
end
end
nil
end
value = :stage
arr = [{ :users=>[{ :admins=>[:address, :stage] }] }]
return_path(arr, :stage)
#=> [0, :users, 0, :admins, 1]
arr = [{ :users=>[{ :admins=>[:what, { :huh => [:stage, :address] }] }] }]
return_path(arr, :stage)
#=> [0, :users, 0, :admins, 1, :huh, 0]
arr = [{ :users=>[{ :admins=>[{ :huh => [:name, :address] }, :what ] }] }]
return_path(arr, :stage)
#=> nil
は、あなたの方法は二番目の引数、[値]を持っているべき要素のインデックスを返す関数をしたい(例えば、 '値#=> :ステージ ')?例を挙げると、各入力オブジェクトに変数を割り当てると便利です(例えば、 'arr = [{:users => ...]')。そうすることで、読者は答えやコメントを定義することなくそれらの変数(ここではただ一つ)を参照することができ、すべての読者は同じ変数を参照します。期待どおりの結果を示すことも役立ちます。それを行うためにあなたの質問を編集したいかもしれません。 –
広さの最初の検索または深さの最初の検索を参照してください:http://codereview.stackexchange.com/questions/109034/breadth-and-depth-first-search-in-ruby –
cary、はいそれは別の引数を持つことができます。インスピレーションのためには – anyavacy