2012-09-04 89 views
0

我喜歡這裏顯示方法 - https://stackoverflow.com/a/9648410/1646893,我想在我的情況下使用它。 如果我們有這樣的事情:拼合哈希有兩個相同的鍵名(陣列)

{"a"=>{"b"=>"111", "c"=>"9", "d"=>{"ff"=>{"uu"=>[{"q"=>"77", "r"=>{"w"=>"66"}, "j"=>{"@l"=>"44"}}, {"q"=>"78", "r"=>{"w"=>"67"}, "j"=>{"@l"=>"45"}}]}, "@e"=>"56"}, "@b1"=>"01", "@b2"=>"02", "@b3"=>"03"}} 

,當我試圖用我們的方法:

{["a", "b"]=>"111", ["a", "c"]=>"9", ["a", "d", "ff", "uu"]=>[{"q"=>"77", "r"=>{"w"=>"66"}, "j"=>{"@l"=>"44"}}, {"q"=>"78", "r"=>{"w"=>"67"}, "j"=>{"@l"=>"45"}}], ["a", "d", "@e"]=>"56", ["a", "@b1"]=>"01", ["a", "@b2"]=>"02", ["a", "@b3"]=>"03"} 

結果就是具有2個值的數組:

[{"q"=>"77", "r"=>{"w"=>"66"}, "j"=>{"@l"=>"44"}}, {"q"=>"78", "r"=>{"w"=>"66"}, "j"=>{"@l"=>"44"}}] 

這是我想:

["a", "d", "ff", "uu", "q0", "w0", "j0", "@l0"]=>"44" 

也許我應該使用flat_hash方法之前改變鍵的名字呢? 我該怎麼做才能讓結果沒有數組和鍵名包含?

+3

你知道它是不可讀? – apneadiving

+0

必須有爲了得到期望的結果 – Bijendra

+0

出於好奇的關係:爲什麼地球上你要嗎?將數組中擁有的對象的索引與子項的鍵名組合起來有什麼好處?如果有的話我會認爲你會想要:'[「a」,「d」,「ff」,「uu」,「q」,0,「w」,「j」,「@ l」] => 「44」' – Phrogz

回答

1

這裏是我的回答產生我相信是一個更好的輸出你所要求的。如果你完全絕望地需要你所要求的輸出,那麼這麼說吧,也許我會提供一個產生它的變體。

class Hash; def each_with_key; each{ |k,v|   yield(v,k) }; end; end 
class Array; def each_with_key; each.with_index{ |v,i| yield(v,i) }; end; end 

def path_to_values(hash) 
    {}.tap do |result| 
    crawl = ->(o,chain=[]) do 
     o.each_with_key do |v,k| 
     path = chain + [k] 
     (v.is_a?(Hash) || v.is_a?(Array)) ? crawl[v,path] : result[path] = v 
     end 
    end 
    crawl[hash] 
    end 
end 

看在行動:

h = { 
    "a" => { 
    "b"=>"111", "c"=>"9", 
    "d"=>{ 
     "ff"=>{ 
     "uu"=>[ 
      { "q"=>"77", 
      "r"=>{"w"=>"66"}, 
      "j"=>{"@l"=>"44"}}, 
      { "q"=>"78", 
      "r"=>{"w"=>"67"}, 
      "j"=>{"@l"=>"45"}} 
     ] 
     }, 
     "@e"=>"56" 
    }, 
    "@b1"=>"01", "@b2"=>"02", "@b3"=>"03" 
    } 
} 
require 'pp' 
pp path_to_values(h) 
#=> {["a", "b"]=>"111", 
#=> ["a", "c"]=>"9", 
#=> ["a", "d", "ff", "uu", 0, "q"]=>"77", 
#=> ["a", "d", "ff", "uu", 0, "r", "w"]=>"66", 
#=> ["a", "d", "ff", "uu", 0, "j", "@l"]=>"44", 
#=> ["a", "d", "ff", "uu", 1, "q"]=>"78", 
#=> ["a", "d", "ff", "uu", 1, "r", "w"]=>"67", 
#=> ["a", "d", "ff", "uu", 1, "j", "@l"]=>"45", 
#=> ["a", "d", "@e"]=>"56", 
#=> ["a", "@b1"]=>"01", 
#=> ["a", "@b2"]=>"02", 
#=> ["a", "@b3"]=>"03"} 
+0

太棒了!這是我需要的,謝謝你的魔力。 – KonstantinP