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
如果您的方法有一個第二個參數,'value'的索引的函數(例如,'值#=> :stage')?舉一個例子時,給每個輸入對象分配一個變量(例如'arr = [{:users => ...]')是有幫助的。這樣讀者可以在回答和評論中引用這些變量(這裏只是一個),而不必定義它們,所有讀者都會引用相同的變量。顯示您的預期或期望的結果也很有幫助。你可能希望編輯你的問題來做到這一點。 –
查看廣度第一搜索或深度優先搜索:http://codereview.stackexchange.com/questions/109034/breadth-and-depth-first-search-in-ruby –
cary,是的,它可以有另一個參數。 – anyavacy