2012-09-10 77 views
-2

我想要合併2個哈希值並提供給我,如'預期結果'部分中給出的。 任何想法?哈希合併和重新排序

示例數據:

list1 = { '1' => [item1] } 
list2 = { '1' => [item2], '2' => [item3]} 

預期結果

{ 
    '1' => {:from_list1 => [item1], :from_list2 => [item2]}, 
    '2' => {:from_list2 => [item3]} 
} 

注:這幾乎是一個在Best way to combine 2 hashes in this order

+0

這應該是相對簡單的;你試過什麼了? – waldrumpus

+0

您的預期結果不是有效的Ruby對象。 – sawa

+0

爲什麼不是一個有效的ruby對象?這是一個散列。並且散列值也是散列值。這是一個錯誤的紅寶石對象? Ruby沒有問題就接受了。 item1,item2等是我定義的某些類的對象。 – ddb

回答

1

我的其他問題的更新嘗試嵌套inject

list1={'1'=>['item1'],'3'=>['item4']} 
list2={"1"=>["item2"], "2"=>["item3"]} 

list2.inject(list1.inject({}) { |c, (k, v)| 
    c[k]=(list2.has_key?(k) ? {:from_list1=>v,:from_list2=>list2[k]} : {:from_list1=>v}) 
    c 
    }) { |c, (k, v)| 
     c[k]||={:from_list2=>v} 
     c 
} 

#result: 
{"1"=>{:from_list1=>["item1"], :from_list2=>["item2"]}, "3"=>{:from_list1=>["item4"]}, "2"=>{:from_list2=>["item3"]}} 
+0

沒有..當其中一個列表沒有密鑰時,這不起作用。在上面的例子中,它只會返回{「1」=> {:from_list1 => [item1],:from_list2 => [item2]},「2」=> [item3]}。看到第二個鍵有一個數組而不是哈希 – ddb

+0

嘗試編輯答案。 – rogal111

+0

是的,這有效。謝謝 – ddb