【发布时间】:2020-02-21 02:06:23
【问题描述】:
我有一个嵌套哈希,我正试图按名称排序。
pigeon_data = {
:color => {
:purple => ["Theo", "Peter Jr.", "Lucky"],
:grey => ["Theo", "Peter Jr.", "Ms. K"],
:white => ["Queenie", "Andrew", "Ms. K", "Alex"],
:brown => ["Queenie", "Alex"]
所以我正在寻找类似的东西
"Theo" => {
:color => ["purple", "grey"],
:gender => ["male"],
:lives => ["Subway"]
},
"Peter Jr." => {
:color => ["purple", "grey"],
:gender => ["male"],
:lives => ["Library"]
},
但是每次我尝试更改其中一个值时,它最终都会更改具有相同键的所有值。
{"Theo"=>
{:color=>["purple", "grey"],
"Peter Jr."=>
{:color=>["purple", "grey"],
...
我的代码一团糟,但这里是更早的 代码已经将七只鸟作为顶级键放入嵌套哈希中 我认为问题出在附近
def sort_birds(new_sort_1)
new_sort_2 = Marshal.load(Marshal.dump(new_sort_1))
new_sort_1.each do |ka,va|
va.each do |kb,vb|
vb.each do |kc,vc|
#binding.pry
if vc.include?("#{ka}") && new_sort_2[ka][kb].is_a?(Array)
new_sort_2["#{ka}"][kb] << "#{kc}"
elsif vc.include?("#{ka}")
new_sort_2["#{ka}"][kb] = Array.new
new_sort_2["#{ka}"][kb] << "#{kc}"
else
【问题讨论】:
-
请给出前数据和结束数据的完整例子。
-
元帅带着转储出现在这里真的很奇怪。你只是想对结构进行深度克隆吗?也可以代替
"#{ka}"做ka。不需要额外的引号。如果您想对它们的键进行字符串化,请明确说明:ka.to_s. -
抱歉,我不能提交比
pigeon_data = { :color => { :purple => ["Theo", "Peter Jr.", "Lucky"], :grey => ["Theo", "Peter Jr.", "Ms. K"], :white => ["Queenie", "Andrew", "Ms. K", "Alex"], :brown => ["Queenie", "Alex"] }, :gender => { :male => ["Alex", "Theo", "Peter Jr.", "Andrew", "Lucky"], :female => ["Queenie", "Ms. K"] }, :lives => { "Subway" => ["Theo", "Queenie"], "Central Park" => ["Alex", "Ms. K", "Lucky"], "Library" => ["Peter Jr."], "City Hall" => ["Andrew"] } }更多的代码 -
希望将所有 7 只鸟的名字都作为顶级散列来指向它们的颜色、性别和生活
-
我有一些关于如何改进您的问题的建议(但现在改变它为时已晚):1)使您的示例中的所有输入有效 Ruby 对象,部分以便读者可以剪切- 并粘贴而无需调试。例如,
pigeon_data缺少两个右大括号; 2) 当您给出一个示例时,always 将所需的返回值显示为一个有效的 Ruby 对象。这里只显示部分返回值(仅限'Theo'和'Peter Jr.')并引入了不知从何而来的新元素(:gender和:lives)...