2011-09-15 26 views
0

我有2列如:Ruby on Rails的:合併2個ActiveRecord的陣列

arr1 : {[:day => 12, :sum_src => 1234], [:day => 14, :sum_src => 24543]} 
arr2 : {[:day => 12, :sum_dst => 4234], [:day => 14, :sum_dst => 342334]} 

我想這兩個數組合併成一個,所以它看起來像:

arr3 : {[:day => 12, :sum_src => 1234, :sum_dst => 4234],[:day => 14, :sum_src => 24543, :sum_dst => 342334]} 

是它可能?以及如何做到這一點?

+0

,看起來不像陣列給我,哈希? –

+0

我已經修復了我的第一條消息 – Pavel

回答

0

就像奧馬爾指出的那樣,這些都是哈希。如果你有兩個散列:

h1 = { "a" => 100, "b" => 200 } 
h2 = { "b" => 254, "c" => 300 } 
h1.merge(h2) #=> {"a"=>100, "b"=>254, "c"=>300} 

在你的情況下,如果要合併到數組和刪除重複,我會用聯盟運營商:

[ "a", "b", "c" ] | [ "c", "d", "a" ] #=> [ "a", "b", "c", "d" ] 

從Rails的API服用。 祝你好運!

+0

<%@ sum_all = @ sum_dst.merge(@sum_src)%> [#,#]未定義的合併方法:Array – Pavel

0

(你已經混了字面上的哈希和數組的語法,但無論如何...)

這裏是一個簡短的,但稍微有點隱蔽的解決方案:

arr1 = [{:day => 12, :sum_src => 1234}, {:day => 14, :sum_src => 24543}] 
arr2 = [{:day => 12, :sum_dst => 4234}, {:day => 14, :sum_dst => 342334}] 

result = (arr1 + arr2).inject({}) { |mem, x| 
    (mem[x[:day]] ||= {}).merge!(x); mem 
}.values 

結果:

[{:sum_dst=>4234, :day=>12, :sum_src=>1234}, {:sum_dst=>342334, :day=>14, :sum_src=>24543}] 

一更可讀的版本可能會有更明確的循環。 (左爲讀者作爲練習。)

1

Riffing關閉Qerub的答案 - 如果陣列作爲例子拉鍊分類可以是一個很好的工具:

arr1 = [{:day => 12, :sum_src => 1234}, {:day => 14, :sum_src => 24543}] 
arr2 = [{:day => 12, :sum_dst => 4234}, {:day => 14, :sum_dst => 342334}] 
arr1.zip(arr2).map {|a,b| a.merge!(b)} 

結果

[{:day=>12, :sum_dst=>4234, :sum_src=>1234}, {:day=>14, :sum_dst=>342334, :sum_src=>24543}]