2016-09-17 90 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