2010-06-01 8 views
1

두 개의 배열이 있습니다. 각 배열에는 특성 해시가있는 배열이 있습니다.해시 배열 병합

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}]] 

반복 방법과 병합 방법을 포함하여 몇 가지 시도를했지만 필요한 배열을 가져올 수 없었습니다.

답변

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}] 
+0

으악합니다. 네, 그건 오타였습니다. 답변 해주셔서 감사합니다! – Ben

+0

@Ben, 오신 것을 환영합니다! 귀하의 수정 내용을 반영하여 답변을 편집했습니다. –

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