Ruby 使用两个相同的键名展平散列(数组)

Ruby 使用两个相同的键名展平散列(数组),ruby,arrays,hash,Ruby,Arrays,Hash,我喜欢这里展示的方法——我想在我的案例中使用它。 如果我们有这样的东西怎么办: {"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"=>"5

我喜欢这里展示的方法——我想在我的案例中使用它。 如果我们有这样的东西怎么办:

{"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"
等等

也许我应该在使用平面散列方法之前更改键名?
如果没有数组和键名,我应该怎么做才能得到结果?

下面是我的答案,我相信它能产生更好的输出,满足您的要求。如果您确实非常需要您所要求的输出,那么就这么说,也许我会提供一个变体来产生它

类散列;用_键定义每个_;每个{k,v{产生(v,k)};结束;结束
类数组;用_键定义每个_;每一个。具有{v,i{屈服(v,i)}指数;结束;结束
def path_到_值(散列)
{}。点击do|结果|
爬网=->(o,链=[])执行
o、 每个带键do | v,k的|
路径=链+[k]
(v.is_a?(散列)| v.is_a?(数组))?爬网[v,路径]:结果[path]=v
结束
结束
爬网[散列]
结束
结束
在行动中看到:

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”
}
}
需要“pp”
pp路径_到_值(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”}

为了得到想要的结果,必须有一种关系。好奇的是:你到底为什么想要这个?将数组中所属对象的索引与子对象的键名相结合有什么好处?如果我认为你想要什么:
[“a”、“d”、“ff”、“uu”、“q”、0、“w”、“j”、“@l”]=>“44”
请注意(从我的示例输出和示例输入的重新格式化中可以看出),你所拥有的与你想要的并不完全对应:
w
从来都不是
q
的孩子。对不起,这是我的第一个问题。将来我会试着问一个更准确的问题。