19

次のようなハッシュの配列があります

[ {:type=>"Meat", :name=>"one"}, 
  {:type=>"Meat", :name=>"two"}, 
  {:type=>"Fruit", :name=>"four"} ]

そして私はそれをこれに変換したい

{ "Meat" => ["one", "two"], "Fruit" => ["Four"]}

私は試しgroup_byましたが、私はこれを得ました

{ "Meat" => [{:type=>"Meat", :name=>"one"}, {:type=>"Meat", :name=>"two"}],
  "Fruit" => [{:type=>"Fruit", :name=>"four"}] }

そして、完全なハッシュではなく名前だけを残すように変更することはできません。grouped_options_for_selectこれは Rails フォーム用であるため、1 行で行う必要があります。

4

6 に答える 6

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

次の steenslag の提案:

array.group_by{|h| h[:type]}.each{|_, v| v.map!{|h| h[:name]}}
# => {"Meat"=>["one", "two"], "Fruit"=>["four"]}
于 2013-09-20T15:57:53.623 に答える
16

初期配列に対する 1 回の反復では、次のようになります。

arry.inject(Hash.new([])) { |h, a| h[a[:type]] += [a[:name]]; h }
于 2013-09-20T16:01:13.430 に答える
3

ActiveSuport の使用Hash#transform_values:

array.group_by{ |h| h[:type] }.transform_values{ |hs| hs.map{ |h| h[:name] } }
#=> {"Meat"=>["one", "two"], "Fruit"=>["four"]}
于 2016-10-27T21:04:56.473 に答える
2

私は以下のようにします:

hsh =[{:type=>"Meat", :name=>"one"}, {:type=>"Meat", :name=>"two"}, {:type=>"Fruit", :name=>"four"}]
p Hash[hsh.group_by{|h| h[:type] }.map{|k,v| [k,v.map{|h|h[:name]}]}]

# >> {"Meat"=>["one", "two"], "Fruit"=>["four"]}
于 2013-09-20T16:04:20.950 に答える
2
array = [{:type=>"Meat", :name=>"one"}, {:type=>"Meat", :name=>"two"}, {:type=>"Fruit", :name=>"four"}]
array.inject({}) {|memo, value| (memo[value[:type]] ||= []) << value[:name]; memo}
于 2013-09-20T16:00:18.523 に答える