簡體   English   中英

如何將兩個嵌套數據結構合並為一個?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM