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