我有两个阵列:
members = ["Matt Anderson", "Justin Biltonen", "Jordan Luff", "Jeremy London"]
instruments = ["guitar, vocals", "guitar", "bass", "drums"]
Run Code Online (Sandbox Code Playgroud)
我想要做的是组合这些,以便生成的数据结构像这样的哈希:
{"Matt Anderson"=>["guitar", "vocals"], "Justin Biltonen"=>"guitar", "Jordan Luff"=>"bass", "Jeremy London"=>"drums"}
Run Code Online (Sandbox Code Playgroud)
请注意,"Matt Anderson"的值现在是数组而不是字符串.任何Ruby巫师都在关注这个问题吗?
我知道几乎按照我想要的方式Hash[*members.zip(instruments).flatten]将它们组合在一起,但是首先将"吉他,人声"字符串转换为数组呢?谢谢.
Raj*_*Raj 105
正如Rafe Kettler所说,使用拉链是可行的方法.
Hash[members.zip(instruments)]
Run Code Online (Sandbox Code Playgroud)
noh*_*hat 45
使用map和split将乐器字符串转换为数组:
instruments.map {|i| i.include?(',') ? (i.split /, /) : i}
Run Code Online (Sandbox Code Playgroud)
然后使用Hash[]并zip结合members使用instruments:
Hash[members.zip(instruments.map {|i| i.include?(',') ? (i.split /, /) : i})]
Run Code Online (Sandbox Code Playgroud)
要得到
{"Jeremy London"=>"drums",
"Matt Anderson"=>["guitar", "vocals"],
"Jordan Luff"=>"bass",
"Justin Biltonen"=>"guitar"}
Run Code Online (Sandbox Code Playgroud)
如果您不关心单项列表是否也是数组,则可以使用这个更简单的解决方案:
Hash[members.zip(instruments.map {|i| i.split /, /})]
Run Code Online (Sandbox Code Playgroud)
这给你这个:
{"Jeremy London"=>["drums"],
"Matt Anderson"=>["guitar", "vocals"],
"Jordan Luff"=>["bass"],
"Justin Biltonen"=>["guitar"]}
Run Code Online (Sandbox Code Playgroud)
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}
Run Code Online (Sandbox Code Playgroud)
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"]}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
42403 次 |
| 最近记录: |