合并两个都具有键值对的数组(Ruby)

时间:2014-09-29 19:30:08

标签: ruby-on-rails ruby arrays merge

我想知道如何将这两个数组合并到Ruby中的一个干净数组中 两个阵列共享一个相似的键:值对。我正在尝试合并来自这两个具有同一人信息的独立数组的信息。一个阵列有他的名字。另一个阵列有他的工作和年龄。两个数组的id都与同一个人匹配 我正在尝试做的一个例子

array1 = [ {:id => 1, :name => "Bob"}, {:id => 2, :name => "Tim"}]
array2 = [ {:id => 1, :job => "firefighter", :age => 25}, { :id => 2, :job => "accountant",      :age => 30} ]


new_array = [ {:id=> 1, name => "Bob", :job => "firefighter", :age => 25}, { :id => 2, :name => "Tim", :job => "accountant", :age => 30} ]

2 个答案:

答案 0 :(得分:3)

你可以这样做:

new_array = array1.each_with_index.map { |x, i| x.merge array2[i] }
# => [{:id=>1, :name=>"Bob", :job=>"firefighter", :age=>25}, {:id=>2, :name=>"Tim", :job=>"accountant", :age=>30}]

如果您想要一个不依赖于数组顺序的解决方案,而是使用:id来匹配哈希值:

array1.map { |x| x.merge (array2.find { |h| h[:id] == x[:id] } || {}) }

答案 1 :(得分:1)

如果两个数组在相同位置包含相同的:id值:

array1.zip(array2).map { |g,h| g.merge(h) }
  #=> [{:id=>1, :name=>"Bob", :job=>"firefighter", :age=>25},
  #    {:id=>2, :name=>"Tim", :job=>"accountant", :age=>30}]

或等效地:

[array1, array2].transpose.map { |g,h| g.merge(h) }

如果两个数组包含相同的:id值,但不一定在同一位置:

(array1 + array2).group_by { |h| h[:id] }
                 .values
                 .map { |g,h| g.merge(h) }

array1.sort_by { |h| h[:id] }
      .zip(array2.sort_by { |h| h[:id] } )
      .map { |g,h| g.merge(h) }