60 votes

Combinez deux tableaux en hachage

J'ai deux tableaux:

 members     = ["Matt Anderson", "Justin Biltonen", "Jordan Luff", "Jeremy London"]
instruments = ["guitar, vocals", "guitar", "bass", "drums"]
 

Ce que je voudrais faire est de les combiner pour que la structure de données résultante soit un hachage, comme ceci:

 {"Matt Anderson"=>["guitar", "vocals"], "Justin Biltonen"=>"guitar", "Jordan Luff"=>"bass", "Jeremy London"=>"drums"}
 

Notez que la valeur de "Matt Anderson" est maintenant un tableau plutôt qu'une chaîne. Est-ce que des sorciers Ruby ont envie de tenter le coup?

Je sais que Hash[*members.zip(instruments).flatten] combine presque comme je le veux, mais qu’en est-il d’abord de transformer la chaîne "guitares, voix" en tableau? Merci.

116voto

Raj Points 647

Comme l'a écrit Rafe Kettler, l'utilisation du zip est la voie à suivre.

 Hash[members.zip(instruments)] 
 

50voto

nohat Points 2818

Utiliser map et split de conversion de l'instrument cordes dans des tableaux:

instruments.map {|i| i.include?(',') ? (i.split /, /) : i}

Ensuite, utilisez Hash[] et zip de combiner members avec instruments:

Hash[members.zip(instruments.map {|i| i.include?(',') ? (i.split /, /) : i})]

pour obtenir

{"Jeremy London"=>"drums",
 "Matt Anderson"=>["guitar", "vocals"],
 "Jordan Luff"=>"bass",
 "Justin Biltonen"=>"guitar"}

Si vous n'avez pas de soins si le seul élément listes sont également des tableaux, vous pouvez utiliser cette solution plus simple:

Hash[members.zip(instruments.map {|i| i.split /, /})]

ce qui vous donne ceci:

{"Jeremy London"=>["drums"],
 "Matt Anderson"=>["guitar", "vocals"],
 "Jordan Luff"=>["bass"],
 "Justin Biltonen"=>["guitar"]}

12voto

coolesting Points 543

Exemple 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}
 

Exemple 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"]}
 

3voto

Mario Viapiano Points 22

C’est la meilleure façon de nettoyer ce que vous voulez.

 members.zip(instruments).to_h
 

Prendre plaisir!

1voto

Zabba Points 26372
h = {}
members.each_with_index do |el,ix|
    h[el] = instruments[ix].include?(",") ? instruments[ix].split(",").to_a : instruments[ix]
end
h

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X