在嵌套哈希中添加哈希值 - 加入嵌套哈希Ruby

时间:2013-12-01 09:40:42

标签: ruby-on-rails ruby hash merge nested

我有两个哈希......

[
    {
        "title"=>"CEO",
        "name"=>"George",
        "columns"=>[
      {
        "display_name"=> "Salary",
        "value"=>"3.85",
      }
    , {
        "display_name"=> "Bonus",
        "value"=>"994.19",
      }
    , {
        "display_name"=> "Increment",
        "value"=>"8.15",
       }
                    ]
    }
]


data2 = JSON.parse(data2)['info']
puts data2

[
    {
        "title"=>"CEO",
        "name"=>"George",
        "columns"=>[
      {
        "display_name"=> "Address",
        "value"=>"Albany",
      }
    , {
        "display_name"=> "Phone",
        "value"=>"47123",
      }
    , {
        "display_name"=> "Mobile",
        "value"=>"784123",
      }
                    ]
    }
]

如果符合条件,我希望将“columns”中的值加入到一个哈希中,就像两个哈希中的name = george一样

所需的输出就像

[
    {
        "title"=>"CEO",
        "name"=>"George",
        "columns"=>[
      {
        "display_name"=> "Salary",
        "value"=>"3.85",
      }
    , {
        "display_name"=> "Bonus",
        "value"=>"994.19",
      }
    , {
        "display_name"=> "Increment",
        "value"=>"8.15",
      }
    , {
        "display_name"=> "Address",
        "value"=>"Albany",
      }
    , {
        "display_name"=> "Phone",
        "value"=>"47123",
      }
    , {
        "display_name"=> "Mobile",
        "value"=>"784123",
      }
                      ]
    }
]

我所尝试的是zip,merge,inject,join,hash deep merge,但我能得到的最好的是一个新的Hash,它丢弃所有第一个值并存储第二个

1 个答案:

答案 0 :(得分:0)

您可以使用Array#|合并两个数组:

data.each do |item|
    # find matching entry in data2
    item2 = data2.find {|item2| item2['name'] == item['name'] }
    # join both columns if matching data was found
    item['columns'] = item['columns'] | item2['columns'] if item2
end

这会修改您的data变量,以包含datadata2的列。

=> [{"title"=>"CEO",
  "name"=>"George",
  "columns"=>
   [{"display_name"=>"Salary", "value"=>"3.85"},
    {"display_name"=>"Bonus", "value"=>"994.19"},
    {"display_name"=>"Increment", "value"=>"8.15"},
    {"display_name"=>"Address", "value"=>"Albany"},
    {"display_name"=>"Phone", "value"=>"47123"},
    {"display_name"=>"Mobile", "value"=>"784123"}]}]

item2 = data2.find {|item2| item2['name'] == item['name'] }中的块定义两个项是否相等。如果您愿意,您可以修改该块以比较其他值(例如title)。


为了记录,我认为这是datadata2的定义:

data= [
    {"title"=>"CEO",
    "name"=>"George",
    "columns"=>[
        {
            "display_name"=> "Salary",
            "value"=>"3.85",
        }, {
            "display_name"=> "Bonus",
            "value"=>"994.19",
        }, {
            "display_name"=> "Increment",
            "value"=>"8.15",
        }
    ]}
  ]

data2 = [{
    "title"=>"CEO",
    "name"=>"George",
    "columns"=>[{
        "display_name"=> "Address",
        "value"=>"Albany",
    }, {
        "display_name"=> "Phone",
        "value"=>"47123",
    }, {
        "display_name"=> "Mobile",
        "value"=>"784123",
    }]
}]