2012-06-23 44 views
11

Parece que no puedo encontrar en ninguna parte que se refiera a esto.fusionando el hash de ruby ​​con la matriz de valores en otro hash con una matriz de valores

Decir que tengo un hash {"23"=>[0,3]} y quiero fusionar en este hash {"23"=>[2,3]} a resultar con este hash {"23"=>[0,2,3]}

O qué tal {"23"=>[3]} se fusionó con {"23"=>0} para obtener {"23"=>[0,3]}

Gracias!

+0

Bueno, * ¿qué has intentado *? De todos modos, miró 'inject'? Sin embargo, podría haber un enfoque más inteligente de zip-by-key ... –

+0

@pst: ¿O, mejor, 'reducir'? :) –

+0

@SergioTulentsev O algo así :-) –

Respuesta

23
{"23"=>[0,3]}.merge({"23"=>[2,3]}){ |key,oldval,newval| oldval | newval } 
#=> {"23"=>[0, 3, 2]} 

Más de forma genérica para manejar los valores no-array:

{"23"=>[0,3]}.merge({"23"=>[2,3]}) do |key, oldval, newval| 
    (newval.is_a?(Array) ? (oldval + newval) : (oldval << newval)).uniq 
end 

Actualizado con una pizca de Marc-André Lafortune.

+2

No sabía combinar podría tomar un bloque. ¡Dulce! –

+0

Eso es asombroso. ¡Funciona perfectamente! +1 para megas! ¡Gracias! – bfcoder

+4

Mejor, más corto, más rápido de usar 'oldval | newval' luego '(oldval + newval) .uniq' –

Cuestiones relacionadas