如何将两个嵌套数据结构合并为一个?

时间:2016-05-25 19:00:45

标签: ruby hashmap

我需要确定一种将两个嵌套数据结构合并为一个的方法。

这是第一个哈希:

[
  {
     "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"
   }
]

2 个答案:

答案 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"}}