ruby - 如何更新键在 ruby 中多次出现的单个哈希值?
问题描述
我有一个嵌套哈希,我试图按 name 排序。
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
解决方案
鉴于提供的结构:
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"] } }
我们可以使用基于默认进程构建的 Hash 遍历集合。
builder = Hash.new {|h,k| h[k] = Hash.new {|h2,k2| h2[k2] = []}}
pigeon_data.each_with_object(builder) do |(category,values),cage|
values.each do |cat_value,birds|
birds.each do |bird|
cage[bird][category] << cat_value
end
end
end
当构建器收到一个新键时,它会分配一个新的哈希作为值。当这个嵌套哈希接收到一个新键时,它会分配一个空数组作为值。因此,我们只需按照我们希望它们出现的顺序放置项目[bird][category] << value
导致:
{"Theo"=>{
:color=>[:purple, :grey],
:gender=>[:male],
:lives=>["Subway"]},
"Peter Jr."=>{
:color=>[:purple, :grey],
:gender=>[:male],
:lives=>["Library"]},
"Lucky"=>{
:color=>[:purple],
:gender=>[:male],
:lives=>["Central Park"]},
"Ms. K"=>{
:color=>[:grey, :white],
:gender=>[:female],
:lives=>["Central Park"]},
"Queenie"=>{
:color=>[:white, :brown],
:gender=>[:female],
:lives=>["Subway"]},
"Andrew"=>{
:color=>[:white],
:gender=>[:male],
:lives=>["City Hall"]},
"Alex"=>{
:color=>[:white, :brown],
:gender=>[:male],
:lives=>["Central Park"]}}
推荐阅读
- python - 是否可以让 mybinder 从 github 下载“custom.js”,并使用此键盘快捷键自定义文件来启动 docker?
- shell - 停止和删除容器有时不起作用
- python - 如何在 xlsx 中动态更改单元格大小
- assembly - 旧 8085 程序的汇编器,带有 .page 或 .=0000h 等指令
- java - 如何设置 FormAuthenticator 属性
- python - 如何在两个张量之间进行元素卷积?
- python - 如何从html将结果返回到表格或csv类型的格式
- android - 实现动态的“正在维护的应用程序”屏幕
- excel - How to filter out all the dates that are older than 3 months , referencing the current date
- jquery - 选择器检查类是否存在于同一级别