首页 > 解决方案 > 如何更新键在 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

标签: rubyhashkeykey-value

解决方案


鉴于提供的结构:

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"]}} 

推荐阅读