2016-09-17 72 views
0

我有这种格式的散列数组,我想搜索深元素的索引。使用Ruby在散列数组中进行递归(或普通搜索)搜索

[{:users => [{:admins => [:address, :stage]}]}, :client],我想将返回的元件(像:stage

def return_index(array، value) 
return "" #the index even as a string. "[0][:admins][1]". I can use eval to find the index 
end 
+0

如果您的方法有一个第二个参数,'value'的索引的函数(例如,'值#=> :stage')?举一个例子时,给每个输入对象分配一个变量(例如'arr = [{:users => ...]')是有帮助的。这样读者可以在回答和评论中引用这些变量(这里只是一个),而不必定义它们,所有读者都会引用相同的变量。显示您的预期或期望的结果也很有帮助。你可能希望编辑你的问题来做到这一点。 –

+0

查看广度第一搜索或深度优先搜索:http://codereview.stackexchange.com/questions/109034/breadth-and-depth-first-search-in-ruby –

+0

cary,是的,它可以有另一个参数。 – anyavacy

回答

2
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 
+0

需要灵感。我可能需要稍微更新我的问题。导致我真正需要的是价值的完整索引。像'array [0] [:admins] [1]'。不只是一个索引。 – anyavacy

+0

我修改了方法以返回完整路径。 –

+0

'array = [{:banana => [{:apple =>:orange}]}]'。 'return_path(array,:banana)'没有给出正确的结果。我得到'nil' – anyavacy