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

时间:2013-04-24 14:33:26

标签: ruby-on-rails ruby ruby-on-rails-3

假设我有这个数组

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}给了我

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

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

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

这给了我想要的结果

3 个答案:

答案 0 :(得分:1)

你可以这样做:

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

<强>编辑:

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

不完全符合您的要求,仍然留在这里,以防您发现它有用。

相关问题