-2

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

form_details=paramsform_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'

最好的方法是什么?

4

1 回答 1

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 为未设置的 Hash 键设置了有用的默认值,因此我们不必在||=任何地方都设置。

逻辑很简单:对于:address数组的每个索引,将除 into 之外的index所有键的第 th 值压入。:addressinputoutput

于 2013-05-01T19:49:35.553 回答