-2

フィールドproduct_idquantityprice、を含む複数行のフォームがあります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']
}

2 回目は、すべての詳細をグループ化する必要があります。address=>'y'

そして、3 回目で最後のaddress=>'z'.

これを行う最善の方法は何ですか?

4

1 に答える 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 は、設定されていないハッシュ キーの便利なデフォルトを設定するため、||=どこにでも配置する必要はありません。

ロジックは単純です。配列のすべてのインデックスに対して、を除くすべてのキー:addressの th 値を にプッシュします。index:addressinputoutput

于 2013-05-01T19:49:35.553 に答える