2013-03-24 5 views
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 값에 따라 병합해야하며,이 경우 많은 패키지를 가질 수있다.

이 작업을 수행하는 가장 쉬운 방법을 알고 싶습니다. 나는 많은 다른 사람들과 할 수 있었지만.

+0

-1 당신이 가진 것과 같은 데이터 구조가 없으며, 원하는 것을 만들 수도 없습니다. 해시 리터럴을 나타내는'{'만 사용하고 있지만 배열과 해시 조합이있는 것 같습니다. 질문을 편집하여 보유하고있는 실제 데이터를 표시하십시오. (힌트 :'p my_data'는'.inspect' 결과를 출력 할 것입니다.) – Phrogz

+0

당신이 실제로 가지고있는 (해시의 배열) 데이터 구조로 질문을 편집하고 원하는 구조를 이해하기 쉬운 것으로 변경했습니다 각각의 키 중 하나가 해시 배열을 참조하는 해시 배열). – Phrogz

+0

잘못된 외부 해시 구문이 있습니다. 어쩌면 외부 해시를 배열로 변경해야합니까? –

답변

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"} 
#=> ]} 
#=> ] 

위의 실행을 그룹화를 통해 각 키/값 쌍을 사용자 정의 해시로 변형 ("매핑")합니다. 사용자 정의 해시의 내용은 사용자의 희망에 따라 분류됩니다.

+0

감사합니다. Phorogz. 지금 코드를 커밋했지만, 다시 고려할 때이 메서드로 바꿀 것입니다. 다시 한 번 감사드립니다. –

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 
+0

이것은 올바른 방법이 아닙니다. Phorogz는 어떻게하는지 보여주었습니다. 하지만 아무도 관심이 없다면 나는 이것을 지킬 것입니다. –