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

は、あなたの方法は二番目の引数、[値]を持っているべき要素のインデックスを返す関数をしたい(例えば、 '値#=> :ステージ ')?例を挙げると、各入力オブジェクトに変数を割り当てると便利です(例えば、 '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]'のようなものです。 1つのインデックスだけではありません。 – anyavacy

+0

フルパスを返すようにメソッドを変更しました。 –

+0

'配列= [{:バナナ=> [{:リンゴ=>:オレンジ}]}]]' 'return_path(array、:banana)'は正しい結果を出しませんでした。私は 'nil'を取得します – anyavacy

関連する問題