我有两个哈希......
[
{
"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,它丢弃所有第一个值并存储第二个
答案 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
变量,以包含data
和data2
的列。
=> [{"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
)。
为了记录,我认为这是data
和data2
的定义:
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",
}]
}]