I\'ve got two Arrays:
members = [\"Matt Anderson\", \"Justin Biltonen\", \"Jordan Luff\", \"Jeremy London\"]
instruments = [\"guitar, vocals\", \"guitar\
Use map
and split
to convert the instrument strings into arrays:
instruments.map {|i| i.include?(',') ? (i.split /, /) : i}
Then use Hash[]
and zip
to combine members
with instruments
:
Hash[members.zip(instruments.map {|i| i.include?(',') ? (i.split /, /) : i})]
to get
{"Jeremy London"=>"drums",
"Matt Anderson"=>["guitar", "vocals"],
"Jordan Luff"=>"bass",
"Justin Biltonen"=>"guitar"}
If you don't care if the single-item lists are also arrays, you can use this simpler solution:
Hash[members.zip(instruments.map {|i| i.split /, /})]
which gives you this:
{"Jeremy London"=>["drums"],
"Matt Anderson"=>["guitar", "vocals"],
"Jordan Luff"=>["bass"],
"Justin Biltonen"=>["guitar"]}
k = ['a', 'b', 'c']
v = ['aa', 'bb']
h = {}
k.zip(v) { |a,b| h[a.to_sym] = b }
# => nil
p h
# => {:a=>"aa", :b=>"bb", :c=>nil}
k = ['a', 'b', 'c']
v = ['aa', 'bb', ['aaa','bbb']]
h = {}
k.zip(v) { |a,b| h[a.to_sym] = b }
p h
# => {:a=>"aa", :b=>"bb", :c=>["aaa", "bbb"]}
members.inject({}) { |m, e| t = instruments.delete_at(0).split(','); m[e] = t.size > 1 ? t : t[0]; m }
If you don't care about 1-element arrays in the result, you can use:
members.inject({}) { |m, e| m[e] = instruments.delete_at(0).split(','); m }
h = {}
members.each_with_index {|item, index|
h.store(item,instruments[index].split)
}
h = {}
members.each_with_index do |el,ix|
h[el] = instruments[ix].include?(",") ? instruments[ix].split(",").to_a : instruments[ix]
end
h
This is the best and cleanest way to do what you want.
Hash[members.zip(instruments.map{|i| i.include?(',') ? i.split(',') : i})]
Enjoy!