J'ai le tableau suivant et je veux convertir un hash avec des clés comme âge et valeurs comme le nom de la personne. De plus, je veux m'assurer que les gens du même âge appartiennent à la même clé.
hash = Hash[ages.collect {|item| [item[1], item[0]]} ]
4 Réponses :
Vous pouvez créer le hasch d'abord et boucler dans les âges collectant des membres d'âges similaires à des tableaux.
hash = Hash.new{|h,k|h[k]=Array.new()}
ages.each do |age|
hash[age.last]<<age.first
end
p hash #{20=>["alpha", "delta"], 21=>["beta"], 23=>["charlie", "gamma"]}
L'une des solutions possibles est d'utiliser:
HASH # Default_Proc < / code> li>
énumérable # chaque_with_object code> li> li> li>
ol> p>
Encore une autre façon de faire cela: # Transform_values avec Enumérable # Group_by
&: Deuxième code>? Y avait-il une étiquette de rails précédemment?
Hah, je ne me souviens pas de ce qui est dans des rails vs ruby pour être honnête. Et cette réponse s'appuie également sur des méthodes de support active comme je l'ai dit.
group_by code> est rubis énumérable code> pas activeupport code>
Merci ... comme je l'ai dit, je ne peux pas garder la trace, mais c'est bon à savoir.
enum = ages.each_with_object({})
#=> #<Enumerator: [["alpha", 20], ["beta", 21], ["charlie", 23],
# ["delta", 20], ["gamma", 23]]:each_with_object({})>
(str,x),h = enum.next
#=> [["alpha", 20], {}]
str
#=> "alpha"
x #=> 20
h #=> {}
(h[x] ||= []) << str
#=> ["alpha"]
(str,x),h = enum.next
#=> [["beta", 21], {20=>["alpha"]}]
Du h [x] = [* h [x], str] code> à la place :). Je sais que cela fait un tas de tableaux jetés, il a l'air si amusant