合并哈希数组

时间:2010-06-01 04:20:41

标签: ruby arrays hash

我有两个数组,每个数组都包含带属性哈希的数组。

Array1 => [[{attribute_1 = A}, {attribute_2 = B}], [{attribute_1 = A}, {attribute_4 = B}]]
Array2 => [{attribute_3 = C}, {attribute_2 = D}], [{attribute_3 = C, attribute_4 = D}]]

数组中的每个数组都保存一个对象的属性哈希值。在上面的例子中,我正在使用两个对象。每个数组中有两个属性用于两个对象。

如何合并这两个数组?我试图获得一个'对象'数组的单个数组(从一开始就无法获得单个数组,因为我必须进行两次不同的API调用才能获得这些属性)。

DesiredArray => [[{attribute_1 = A, attribute_2 = B, attribute_3 = C, attribute_4 = D}],
                 [{attribute_1 = A, attribute_2 = B, attribute_3 = C, attribute_4 = D}]]

我尝试了一些东西,包括迭代方法和合并方法,但我一直无法得到我需要的数组。

2 个答案:

答案 0 :(得分:5)

您似乎有并行的哈希数组。我们可以使用zip将并行数组转换为哈希数组的单个数组。然后,我们可以使用injectmerge将每个哈希数组映射到一个哈希:

#!/usr/bin/ruby1.8

require 'pp'

array1 = [{:attribute_1 => :A, :attribute_2 => :B}, {:attribute_1 => :A, :attribute_4 => :B}]
array2 = [{:attribute_3 => :C, :attribute_2 => :D}, {:attribute_3 => :C, :attribute_4 => :D}]

pp array1.zip(array2).collect { |array| array.inject(&:merge) }
# => [{:attribute_2=>:D, :attribute_1=>:A, :attribute_3=>:C},
# =>  {:attribute_4=>:D, :attribute_1=>:A, :attribute_3=>:C}]

答案 1 :(得分:1)

我认为我的答案不再有效,因为问题已在稍后编辑。

在这里,首先我要在您的问题中修复数组和哈希表示法。

Array1 = [{'attribute_1' => 'A', 'attribute_2' => 'B'}, {'attribute_1' => 'A', 'attribute_2' => 'B'}]
#=> [{"attribute_1"=>"A", "attribute_2"=>"B"}, {"attribute_1"=>"A", "attribute_2"=>"B"}]
Array2 = [{'attribute_3' => 'C', 'attribute_2' => 'D'}, {'attribute_3' => 'C', 'attribute_4' => 'D'}]
#=> [{"attribute_2"=>"D", "attribute_3"=>"C"}, {"attribute_3"=>"C", "attribute_4"=>"D"}]

您可以简单地连接两个数组以获得所需的数组:

DesiredArray = Array1+Array2
# => [{"attribute_1"=>"A", "attribute_2"=>"B"}, {"attribute_1"=>"A", "attribute_2"=>"B", {"attribute_2"=>"D", "attribute_3"=>"C"}, {"attribute_3"=>"C", "attribute_4"=>"D"}]