2016-11-06 4 views
3

Angesichts einer Reihe von Hashes, wo jeder Hash wie {"date":"date_value", "slots":[slots_value]} ist, würde ich gerne Hashes mit den gleichen Daten auf einem Hash sammeln und Slots Arrays zusammenführen.Ruby on Rails - Sammeln Hashes mit demselben spezifischen Wert

Beispiel Eingabe:

[{"date" : "2016/23/12", "slots" : ["a","b"]}, 
{"date" : "2016/23/12", "slots" : ["c","d","e"]}, 
{"date" : "2016/24/12", "slots" : ["x"]} 
] 

Beispiel Ausgang:

[{"date" : "2016/23/12", "slots" : ["a","b","c","d","e"]}, 
{"date" : "2016/24/12", "slots" : ["x"]} 
] 

Antwort

3

Enumerable#group_by ist ein sehr leistungsfähiges Werkzeug für Hashes und Arrays:

input = [ 
    {"date" => "2016/23/12" , "slots" => ["a","b"]}, 
    {"date" => "2016/23/12", "slots" => ["c","d","e"]}, 
    {"date" => "2016/24/12", "slots" => ["x"]} 
] 

puts input.group_by{|h| h["date"]}.map{|date, hashes| 
    { 
    "date" => date, 
    "slots" => hashes.map{|h| h["slots"]}.flatten 
    } 
} 
#=> {"date"=>"2016/23/12", "slots"=>["a", "b", "c", "d", "e"]} 
# {"date"=>"2016/24/12", "slots"=>["x"]}