通过散列中的元素进行分组

假设我有这个数组

x=[{:shipping_id=>2, :fsn=>"ab", :price=>300, :quantity=>1}, {:shipping_id=>3, :fsn=>"abc",:price=>500, :quantity=>2}, {:shipping_id=>2, :fsn=>"abcd",:price=>300,:quantity=>3}, {:shipping_id=>4, :fsn=>"abx", :price=>600,:quantity=>1}, {:shipping_id=>3, :fsn=>"abb", :price=>400,:quantity=>1}] 

我想按照唯一的送货ID对其进行分组,但在这种情况下,我们只需按shipping_id = 2进行分组

所以我做x.select! {|y| y[:shipping_id]==2} x.select! {|y| y[:shipping_id]==2} x.select! {|y| y[:shipping_id]==2}这给了我

 [{:shipping_id=>2, :fsn=>"ab",:price=>300,:quantity=>1}, {:shipping_id=>2, :fsn=>"abcd",:price=>300,:quantity=>3}] 

但问题是我想要这种forms的结果

 x={:shipping_id=>[2,2],:fsn=>["ab","abcd"],:price=>[300,300],:quantity=>[1,3]} 

我该怎么办? 我可以用几行来做到这一点,但有没有优化的方法呢?

更新 – :最终工作解决方案(我的解决方案) –

调节器

  new_params={} order_hash.each do |row| new_params=row.convert_to_params(new_params) end params.merge!(new_params) 

模型

  def convert_to_params(new_params) item=self.instance_values.symbolize_keys item.each do |k, v| new_params[k].nil? ? new_params[k]=[v] : new_params[k].push(v) end return new_params end 

这给了我想要的结果

 arr = x= [{:shipping_id=>2, :fsn=>"ab"}, {:shipping_id=>3, :fsn=>"abc"}, {:shipping_id=>2, :fsn=>"abcd"}, {:shipping_id=>4, :fsn=>"abx"}, {:shipping_id=>3, :fsn=>"abb"}] @h = {} arr.group_by {|x| x[:shipping_id]==2 }[true].inject({}) do |mem,i| i.each{|k,v| mem[k] = [v] << mem[k] ; @h = mem} end p @h #=> {:shipping_id=>[2, 2], :fsn=>["abcd", "ab"]} 

你可以这样做:

 ret = Hash[x.group_by {|e| e[:shipping_id]}.map {|e| [e.first, e.last.map {|t| t[:fsn]}]}] 

然后,如果你只需要shipping_id = 2

 > ret[2] => ["ab", "abcd"] 

编辑:

 >> z = x.group_by {|y| y[:shipping_id] } #=> {2=>[{:shipping_id=>2, :fsn=>"ab"}, {:shipping_id=>2, :fsn=>"abcd"}], 3=>[{:shipping_id=>3, :fsn=>"abc"}, {:shipping_id=>3, :fsn=>"abb"}], 4=>[{:shipping_id=>4, :fsn=>"abx"}]} >> Hash[z.map {|k, v| Array[[k]*v.count, v] }] #=> {[2, 2]=>[{:shipping_id=>2, :fsn=>"ab"}, {:shipping_id=>2, :fsn=>"abcd"}], [3, 3]=>[{:shipping_id=>3, :fsn=>"abc"}, {:shipping_id=>3, :fsn=>"abb"}], [4]=>[{:shipping_id=>4, :fsn=>"abx"}]} 

不完全是你需要的,仍然留在这里,以防你发现它有用。