我有两个阵列:
members = ["Matt Anderson", "Justin Biltonen", "Jordan Luff", "Jeremy London"]
instruments = ["guitar, vocals", "guitar", "bass", "drums"]
我想要做的是将这些结合起来,以便生成的数据结构像Hash一样:
{"Matt Anderson"=>["guitar", "vocals"], "Justin Biltonen"=>"guitar", "Jordan Luff"=>"bass", "Jeremy London"=>"drums"}
注意“Matt Anderson”的值现在是一个数组而不是一个字符串。任何Ruby巫师都在关注这个问题吗?
我知道Hash[*members.zip(instruments).flatten]
以他想要的方式将它们几乎组合在一起,但是首先将“吉他,声乐”字符串转换为数组呢?感谢。
答案 0 :(得分:101)
正如Rafe Kettler所说,使用拉链是可行的方法。
Hash[members.zip(instruments)]
答案 1 :(得分:44)
使用map
和split
将乐器字符串转换为数组:
instruments.map {|i| i.include?(',') ? (i.split /, /) : i}
然后使用Hash[]
和zip
将members
与instruments
合并:
Hash[members.zip(instruments.map {|i| i.include?(',') ? (i.split /, /) : i})]
获取
{"Jeremy London"=>"drums",
"Matt Anderson"=>["guitar", "vocals"],
"Jordan Luff"=>"bass",
"Justin Biltonen"=>"guitar"}
如果您不关心单项列表是否也是数组,您可以使用这个更简单的解决方案:
Hash[members.zip(instruments.map {|i| i.split /, /})]
给你这个:
{"Jeremy London"=>["drums"],
"Matt Anderson"=>["guitar", "vocals"],
"Jordan Luff"=>["bass"],
"Justin Biltonen"=>["guitar"]}
答案 2 :(得分:8)
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"]}
答案 3 :(得分:3)
这是做你想做的最好,最干净的方法。
Hash[members.zip(instruments.map{|i| i.include?(',') ? i.split(',') : i})]
享受!
答案 4 :(得分:1)
h = {}
members.each_with_index do |el,ix|
h[el] = instruments[ix].include?(",") ? instruments[ix].split(",").to_a : instruments[ix]
end
h
答案 5 :(得分:1)
members.inject({}) { |m, e| t = instruments.delete_at(0).split(','); m[e] = t.size > 1 ? t : t[0]; m }
如果您不关心结果中的1元素数组,可以使用:
members.inject({}) { |m, e| m[e] = instruments.delete_at(0).split(','); m }
答案 6 :(得分:0)
h = {}
members.each_with_index {|item, index|
h.store(item,instruments[index].split)
}