我需要确定一种将两个嵌套数据结构合并为一个的方法。
这是第一个哈希:
[
{
"blake" => {
:awesomeness => 10,
:height => "74",
:last_name => "johnson"
},
"ashley" => {
:awesomeness => 9,
:height => 60,
:last_name => "dubs"
}
}
]
这是第二个哈希:
[
{
:first_name => "blake"
},
{
:first_name => "ashley"
}
]
结果将如下:
[
{
:first_name => "blake",
:awesomeness => 10,
:height => "74",
:last_name => "johnson"
},
{
:first_name => "ashley",
:awesomeness => 9,
:height => 60,
:last_name => "dubs"
}
]
答案 0 :(得分:4)
请注意,你所谓的哈希确实是数组,而且它们也不一致。第一个是包含单个哈希的数组,第二个是包含两个哈希的数组。
对于给定的两个数组,如果我们调用第一个v1
和第二个v2
,则代码下面应该给出您想要的输出:
v1[0].values.map.with_index {|v, i| v2[i].merge(v)}
<强>解释强>
Hash#merge
合并两个哈希值,因此必须使用它来实现结果。
第一个哈希值来自v1
- 我们选择v1
数组的第一个元素,这是一个哈希值,并将其所有的values
都自己哈希 - 因此,我们在v1[0].values
中有一个哈希数组。
第二个哈希数组是v2
。
现在,我们使用Enumerable#map
方法迭代第一个哈希数组,并收集将每个元素与v2
中的相应元素合并的结果。
答案 1 :(得分:2)
我假设您打算定义以下哈希(而不是包含一个元素的数组,哈希)。
h = { "blake" => { :awesomeness => 10,
:height => "74",
:last_name => "johnson"
},
"ashley" => { :awesomeness => 9,
:height => 60,
:last_name => "dubs"
}
}
有很多方法可以将键值对:first_name=>"blake"
和:first_ame=>"ashley"
添加到关联的哈希值中。这是一个:
f = h.each_with_object({}) { |(k,v),g| g[k] = { :first_name => k }.merge(v) }
#=> {"blake" =>{:first_name=>"blake",
# :awesomeness=>10,
# :height=>"74",
# :last_name=>"johnson"},
# "ashley"=>{:first_ame=>"ashley",
# :awesomeness=>9,
# :height=>60,
# :last_name=>"dubs"}}
所以这引出了一个问题:以下数组的功能是什么?
a = [{ :first_name => "blake" }, { :first_name => "ashley" }]
如果此数组用于指定要保留f
的哪些键,我们可以写
retain = a.map { |g| g[:name] }
#=> ["blake", "ashley"]
f.select { |k| retain.include?(k) }
#=> {"blake"=>{:first_name=>"blake", :awesomeness=>10, :height=>"74",
# :last_name=>"johnson"},
# "ashley"=>{:first_name=>"ashley", :awesomeness=>9, :height=>60,
# :last_name=>"dubs"}}
另一方面,如果
a = [{:name=>"blake"}]
然后
retain = a.map { |g| g[:name] }
#=> ["blake"]
f.select { |k| retain.include?(k) }
#=> {"blake"=>{:first_name=>"blake", :awesomeness=>10, :height=>"74",
# :last_name=>"johnson"}}