考虑单个哈希键值合并哈希数组

Mal*_*ana 1 ruby

我有一系列像这样的哈希.

[
 {"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}
]
Run Code Online (Sandbox Code Playgroud)

我希望这就像这样.

[
  {"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"}
  ]},
]
Run Code Online (Sandbox Code Playgroud)

哈希应该根据相等的event_id值进行合并,并且事件可以包含许多包.

我想知道最简单的方法.虽然我可以做很多if和else s.

Phr*_*ogz 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}]
#=> }
Run Code Online (Sandbox Code Playgroud)

有了这个,你可以这样做:

grouped.each do |event_id, packages|
  # event_id is the actual value, like 336
  # packages is an array of hashes from your original
end
Run Code Online (Sandbox Code Playgroud)

如果您确实需要您描述的格式,那么您可以这样做:

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"}
#=>   ]}
#=> ]
Run Code Online (Sandbox Code Playgroud)

以上内容贯穿分组并将每个键/值对转换("映射")为自定义哈希,其内容已根据您的需求进行了分析.