Onze dagmethode #11: Hash#inv_multi
Geplaatst door Michiel de Mare di, 19 feb 2008 08:00:00 GMT
Hash
heeft een invert
-methode, maar vaak heb je een hash die als values arrays heeft. Je wilt natuurlijk geen arrays als keys, maar juist dat elk element in de array een key wordt met als value een array met alle oorspronkelijke keys.
Simpel voorbeeld
{1 => [3,4]}.inv_multi
# => {3=>[1], 4=>[1]}
Complex voorbeeld
{1 => [3,4,5,6], 2 => [3,4], 4 => 11}.inv_multi
# => {5=>[1], 11=>[4], 6=>[1], 3=>[1, 2], 4=>[1, 2]}
De methode:
class Hash
def inv_multi
# there's inject! again. daily method #5
inject!({}) do |h,(k,v)| # Is this obvious? If not, say so!
# this lambda binds h and k.
l = lambda {|x| (h[x] ||= []) << k}
# value doesn't have to be an array
Array === v ? v.each(&l) : l[v]
end
end
end