通过哈希键进行分组

时间:2013-05-01 19:35:57

标签: ruby-on-rails ruby

我有一个包含字段product_idquantitypriceaddress的多行表单。表单中可以有用户定义的行。我想通过唯一的地址对这些条目进行分组。

form_details=params使form_details类似于:

form_details = {
  :product_id => [1,2,3,4,5],
  :quantity => [10,20,30,40,6],
  :price => [100,1000,200,30,2000],
  :address =>[ 'x','y','z','x','y']
}

我想要一个新的哈希,按每个唯一的地址分组。所以,我第一次得到的是:

result = {
  :product_id => [1,4],
  :quantity => [10,40],
  :price => [100,30],
  :address => ['x']
}

第二次所有细节都应通过address=>'y'

进行分组

然后是address=>'z'的第三个也是最后一个。

最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

不太优雅,但这是一个解决方案:

input = {:product_id => [1,2,3,4,5],:quantity=>[10,20,30,40,6],:price=>[100,1000,200,30,2000],:address=>['x','y','z','x','y']}

output = Hash.new do |h, k|
  h[k] = Hash.new do |h, k|
    h[k] = []
  end
end

input[:address].each_with_index do |address, index|
  input.each do |key, value|
    next if key == :address
    output[address][key] << value[index]
  end
end

p output

输出:

{"x"=>{:product_id=>[1, 4], :quantity=>[10, 40], :price=>[100, 30]}, "y"=>{:product_id=>[2, 5], :quantity=>[20, 6], :price=>[1000, 2000]}, "z"=>{:product_id=>[3], :quantity=>[30], :price=>[200]}}

Hash.new为未设置的哈希键设置有用的默认值,因此我们不必在任何地方放入||=

逻辑很简单:对于:address数组的每个索引,将除index :address以外的所有键的input值推送到output