我有一个包含字段product_id
,quantity
,price
,address
的多行表单。表单中可以有用户定义的行。我想通过唯一的地址对这些条目进行分组。
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'
的第三个也是最后一个。
最好的方法是什么?
答案 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