2012-06-23 8 views
11

Nie mogę znaleźć nigdzie, co mówi o zrobieniu tego.scalanie ruby ​​z tablicą wartości do innego hasha z tablicą wartości

Say mam hash {"23"=>[0,3]} i chcę połączyć w ten hash {"23"=>[2,3]} wynikać z tego hash {"23"=>[0,2,3]}

Albo jak o {"23"=>[3]} połączyła się z {"23"=>0} dostać {"23"=>[0,3]}

Dzięki!

+0

Cóż, * co próbowaliście *? W każdym razie, spojrzał na "wstrzyknąć"? Może być bardziej sprytne podejście typu "zip-by-key", chociaż ... –

+0

@pst: Czy lepiej "zmniejszyć"? :) –

+0

@SergioTulentsev Lub coś :-) –

Odpowiedz

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

bardziej ogólny sposób obsłużyć wartości spoza tablicy:

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

Aktualizacja z nutą danego Marc-Andre Lafortune użytkownika.

+2

Nie wiem, że połączenie może zająć blok. Słodkie! –

+0

To jest niesamowite. Działa świetnie! +1 dla megas! Dzięki! – bfcoder

+4

Lepiej, krócej, szybciej używać 'oldval | newval' then '(oldval + newval) .uniq' –

Powiązane problemy