2014-09-29 37 views
1

我想知道如何將這兩個數組合併成一個乾淨的數組在Ruby中
這兩個數組共享一個相似的鍵:值對。我試圖從這兩個單獨的數組中合併來自同一人的信息。一個數組有他的名字。另一個陣列有他的工作和年齡。兩個陣列都有一個id匹配到同一個人。
的什麼,我試圖做合併兩個都具有鍵值對的數組(012)

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

這個不清楚:「兩個陣列共享一個相似的鍵:值對」。什麼是「主題」? – sawa 2014-09-29 19:37:50

+0

主題是人。一個數組有他的名字。另一個陣列有他的工作和年齡。兩個陣列都有一個id匹配到同一個人。 – 2014-09-29 19:40:22

回答

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

謝謝你完美的工作! :) – 2014-09-29 19:48:00

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) } 
相關問題