Ruby数组哈希.group_by并在一行中修改

jto*_*srl 15 ruby hash ruby-on-rails enumerable

我有一系列哈希,类似于

[ {:type=>"Meat", :name=>"one"}, 
  {:type=>"Meat", :name=>"two"}, 
  {:type=>"Fruit", :name=>"four"} ]
Run Code Online (Sandbox Code Playgroud)

我想把它转换成这个

{ "Meat" => ["one", "two"], "Fruit" => ["Four"]}
Run Code Online (Sandbox Code Playgroud)

我尝试了group_by但是我得到了这个

{ "Meat" => [{:type=>"Meat", :name=>"one"}, {:type=>"Meat", :name=>"two"}],
  "Fruit" => [{:type=>"Fruit", :name=>"four"}] }
Run Code Online (Sandbox Code Playgroud)

然后我不能修改它只留下名称而不是完整的哈希.我需要在一行中执行此操作,因为它适用grouped_options_for_select于Rails表单.

saw*_*awa 18

array.group_by{|h| h[:type]}.each{|_, v| v.replace(v.map{|h| h[:name]})}
# => {"Meat"=>["one", "two"], "Fruit"=>["four"]}
Run Code Online (Sandbox Code Playgroud)

遵循steenslag的建议:

array.group_by{|h| h[:type]}.each{|_, v| v.map!{|h| h[:name]}}
# => {"Meat"=>["one", "two"], "Fruit"=>["four"]}
Run Code Online (Sandbox Code Playgroud)

  • 最后一个块可以写成`{| _,v | v.map {|!H | H [:名称]}}` (5认同)

Nik*_*nov 16

在初始数组的单次迭代中:

arry.inject(Hash.new([])) { |h, a| h[a[:type]] += [a[:name]]; h }
Run Code Online (Sandbox Code Playgroud)

  • 你的回答让我更深入地了解了`注入'的冷静.谢谢! (2认同)