2010-10-24 6 views
4

Я пытаюсь объединить несколько массивов хэшей в рубине с помощью общего ключа. Например:Объединение массивов хешей в Ruby

country_info = [ 
    {country_id: "US", country_desc: "United States"}, 
    {country_id: "AU", country_desc: "Australia"} 
] 
country_stats = [ 
    {country_id:"US", pageviews: 150}, 
    {country_id:"AU", pageviews: 200} 
] 

i_want = [ 
    {country_id: "US", country_desc: "United States", pageviews:150}, 
    {country_id: "AU", country_desc: "Australia", pageviews:200} 
] 

Это что-то вроде функции pv.nest протовиса в Javascript. См.: http://protovis-js.googlecode.com/svn/trunk/jsdoc/symbols/pv.Nest.html

как я могу это сделать в Ruby?

+0

Реальный вопрос, почему у вас есть несколько массивов хэшей? Упрощенная общая конструкция может быть в порядке. –

ответ

9

Если вы поместили все разные хэши в один массив, вы можете использовать group_by, чтобы сгруппировать вместе с теми же country_id. Затем вы можете использовать inject с merge к merge их вместе:

country_info_and_stats = country_info + country_stats 
country_info_and_stats.group_by {|x| x[:country_id]}.map do |k,v| 
    v.inject(:merge) 
end 
#=> [{:country_id=>"US", :country_desc=>"United States", :pageviews=>150}, 
# {:country_id=>"AU", :country_desc=>"Australia", :pageviews=>200}] 
+0

Yup. Это сработало. Спасибо. – miguelrios

+1

Если у вас подобная проблема, отличный ответ и объяснение! – Gotjosh

Смежные вопросы