[英]How to combines two nested data structures into one?
我需要確定一種將兩個嵌套數據結構合二為一的方法。
這是第一個哈希:
[
{
"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"
}
]
請注意,你所謂的哈希確實是數組,而且它們也不一致。 第一個是包含單個哈希的數組,第二個是包含兩個哈希的數組。
對於給定的兩個數組,如果我們調用第一個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
相應元素合並的結果。
我假設您打算定義以下哈希(而不是包含一個元素的數組,哈希)。
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"}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.