1

私はこのようなハッシュの配列を持っています。

[
 {"package_details"=>{"name"=>"Package3", "price"=>3000.0, "id"=>"281"},"event_id"=>336},
 {"package_details"=>{"name"=>"2000/-", "price"=>2000.0, "id"=>"280"}, "event_id"=>337}, 
 {"package_details"=>{"name"=>"Package1", "price"=>1000.0, "id"=>"282"},"event_id"=>337},
 {"package_details"=>{"name"=>"Package2", "price"=>2000.0, "id"=>"283"},"event_id"=>337}
]

そして、私はこれがこのようになりたいです。

[
  {"event_id"=>336, "package_details"=>[
    {"name"=>"Package3", "price"=>3000.0, "id"=>"281"}
  ]},
  {"event_id"=>337, "package_details"=>[
    {"name"=>"2000/-", "price"=>2000.0, "id"=>"280"},
    {"name"=>"Package1", "price"=>1000.0, "id"=>"282"},
    {"name"=>"Package2", "price"=>2000.0, "id"=>"283"}
  ]},
]

ハッシュは等しいevent_id値に従ってマージする必要があり、イベントには多くのパッケージが含まれる可能性があります。

これを行う最も簡単な方法を知りたいです。私は多くのifとelseで行うことができましたが。

4

2 に答える 2

5

必要な機能的な結果をもたらす最も簡単な変換は、を使用することEnumerable#group_byです。

details = [
 {"package_details"=>{"name"=>"Package3","price"=>3000.0,"id"=>"281"},"event_id"=>336},
 {"package_details"=>{"name"=>"2000/-","price"=>2000.0,"id"=>"280"},"event_id"=>337}, 
 {"package_details"=>{"name"=>"Package1","price"=>1000.0,"id"=>"282"},"event_id"=>337},
 {"package_details"=>{"name"=>"Package2","price"=>2000.0,"id"=>"283"},"event_id"=>337}
]

grouped = details.group_by{ |d| d["event_id"] }
#=> {
#=>   336=>[
#=>     {"package_details"=>{"name"=>"Package3", "price"=>3000.0, "id"=>"281"}, "event_id"=>336}],
#=>   337=>[
#=>     {"package_details"=>{"name"=>"2000/-", "price"=>2000.0, "id"=>"280"}, "event_id"=>337},
#=>     {"package_details"=>{"name"=>"Package1", "price"=>1000.0, "id"=>"282"}, "event_id"=>337},
#=>     {"package_details"=>{"name"=>"Package2", "price"=>2000.0, "id"=>"283"}, "event_id"=>337}]
#=> }

これであなたはただすることができます:

grouped.each do |event_id, packages|
  # event_id is the actual value, like 336
  # packages is an array of hashes from your original
end

説明した形式が本当に必要な場合は、次のように実行できます。

transformed = details.group_by{ |d| d["event_id"] }.map do |event_id, hashes|
  {
    "event_id"=>event_id,
    "package_details"=>hashes.map{ |h| h["package_details"] }
  }
end    
#=> [
#=>   {"event_id"=>336, "package_details"=>[
#=>     {"name"=>"Package3", "price"=>3000.0, "id"=>"281"}
#=>   ]},
#=>   {"event_id"=>337, "package_details"=>[
#=>     {"name"=>"2000/-", "price"=>2000.0, "id"=>"280"},
#=>     {"name"=>"Package1", "price"=>1000.0, "id"=>"282"},
#=>     {"name"=>"Package2", "price"=>2000.0, "id"=>"283"}
#=>   ]}
#=> ]

上記は、グループ化を実行し、各キーと値のペアをカスタムハッシュに変換(「マップ」)します。カスタムハッシュの内容は、必要に応じて変更されています。

于 2013-03-24T16:28:31.087 に答える
0

ついにできた。上記の入力ハッシュについては、なんとかこんな感じになりました。

[{"packages"=>[{"name"=>"Package3", "price"=>3000.0, "id"=>"281"}], "event_id"=>336}, {"packages"=>[{"name"=>"2000/-", "price"=>2000.0, "id"=>"280"}, {"name"=>"Package1", "price"=>1000.0, "id"=>"282"}, {"name"=>"Package2", "price"=>2000.0, "id"=>"283"}], "event_id"=>337}

これらの方法を使用して。これは最も正確な方法ではありません。しかし、それは私のためにトリックをしました。

event_id_array = Array.new
events_with_packages = Array.new
events.each.each do |event|
event_id_array.push(event.id)
end
event_id_array.uniq!.each_with_index do |e_id, i|
  events_with_packages[i]  = Hash.new
  events_with_packages[i]["event_id"] = e_id
  events_with_packages[i]["packages"] = Array.new
    events.each do |event|
    tmp_event = Hash.new
    if(event.id==e_id)
      tmp_event["id"] = event[:ep_id]
      tmp_event["price"] = event[:price]
      tmp_event["name"] = event[:ep_name]
      events_with_packages[i]["packages"].push(tmp_event)
    end
  end
end
events_with_packages # the answer
于 2013-03-24T10:05:56.353 に答える