将两个数组合并为Hash

Mic*_*win 55 ruby

我有两个阵列:

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)

  • 我见过最简单的解决方案. (6认同)
  • 这个答案是对的.OP要求提供`{"Matt Anderson"=> ["guitar","vocals"],...}`,但这个答案会返回`{"Matt Anderson"=>"guitar,vocals",...} (3认同)
  • 您还可以重构为:`members.zip(instruments).to_h` (3认同)

noh*_*hat 45

使用mapsplit将乐器字符串转换为数组:

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)

  • @steenslag正好是问题所要求的:-) (5认同)

coo*_*ing 9

例01

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)

例02

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)