2012-06-23 22 views
11

Ich kann nicht scheinen, irgendwo zu finden, worüber das spricht.ruby-hash mit Array von Werten in einen anderen hash mit Array von Werten verschmelzen

Sagen, ich habe einen Hash {"23"=>[0,3]} und ich möchte {"23"=>[2,3]} in diesem Hash verschmelzen mit diesem Hash {"23"=>[0,2,3]}

Oder wie wäre es mit {"23"=>[3]}{"23"=>0} verschmolzen bekommen {"23"=>[0,3]}

Dank zur Folge haben!

+0

Nun, * was hast du probiert *? Wie auch immer, schaute auf "inject"? Vielleicht gibt es einen clevereren "Zip-by-Key" -Ansatz, aber ... –

+0

@pst: Oder, besser, 'reduce'? :) –

+0

@SergioTulentsev Oder etwas :-) –

Antwort

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

Weitere generische Art und Weise nicht-Array-Werte zu handhaben:

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

aktualisiert mit einem Marc-André Lafortune des Hinweises.

+2

Wusste nicht, Merge könnte einen Block nehmen. Süss! –

+0

Das ist großartig. Funktioniert perfekt! +1 für Megas! Vielen Dank! – bfcoder

+4

Besser, kürzer, schneller zu verwenden 'oldval | newval 'then' (oldval + newval) .uniq' –

Verwandte Themen