2017-09-14 8 views
1

Ich versuche, JSON-Antwort mit JbuilderArray von Hashes als Hash-Schlüssel und Wert als Array jbuilder mit

Ich habe ein Array von Hashes wie diese

words= [ 
     {"term": "abc", 
     "definition": "123" 
     } , 
     {"term": "abc", 
     "definition": "345" 
     } , 
     {"term": "xyz", 
     "definition": "890" 
     } 
    ] 

ich verdeckte wie dies in würde zu generieren JSON. Logik ist hier alle Bedingungen als Schlüssel nehmen und schieben Sie es Definitionen in Arrays

{ 
    "abc": ["123","345"], 
    “xyz”: ["890"] 
    } 

Was ist erreicht ich so weit ist

words.each do |word| 
    json.set! word['text'] ,word['definition'] 
end 

mich gibt

{ 
    "abc": "123" 
    "abc": "345", 
    "xyz": "890" 
} 

Könnten einige mir auf diesem helfen .

Antwort

0

einfachste Lösung :)

words= [ 
     {"term": "abc", 
     "definition": "123" 
     } , 
     {"term": "abc", 
     "definition": "345" 
     } , 
     {"term": "xyz", 
     "definition": "890" 
     } 
    ] 

result_hash = Hash.new{|hsh, key| hsh[key]=[] } 
words.map{|x| result_hash[x[:term]].push(x[:definition])} 

Ihre Ausgabe in result_hash sein

+0

Es könnte noch kürzer sein: 'words.each_with_object ({}) {| x, acc | (acc [x [: term]] || = []) << x [: definition]} ', aber das OP bat um jbuilder solution. – mudasobwa

0

Sie suchen so etwas wie dieses,

words = [{:term=>"abc", :definition=>"123"}, {:term=>"abc", :definition=>"345"}, {:term=>"xyz", :definition=>"890"}] 
words.inject({}) do |h, w| 
    h[w[:term]] ||= [] 
    h[w[:term]] << w[:definition] 
    h 
end 
#=> {"abc"=>["123", "345"], "xyz"=>["890"]} 
+0

Können wir das Gleiche mit jbuilder tun? –

0
words.group_by{|d| d[:term]}.map{|k,v| {k => v.map{|val| val[:definition]}}}.reduce(&:merge) 
0
words.map(&:values).group_by(&:shift).each do |k, values| 
    json.set! k, values.flatten 
end 

Wenn die Reihenfolge der :term und :definition nicht garantiert ist, gibt es eine Zwischen Aufruf .map(&:sort) auf dem ursprünglichen Hash erforderlich ist, und :shift sollte als :pop gelesen werden, da nach dem Sortieren :definition s vorausgeht :term s.