2012-09-04 61 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