簡體   English   中英

使用jbuilder將哈希數組作為哈希鍵,將值作為數組

[英]array of hashes as hash key and value as array using jbuilder

我正在嘗試使用Jbuilder生成JSON響應

我有很多這樣的哈希

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

我想將此轉換為JSON。 這里的邏輯是將所有術語作為鍵並將其定義推入數組

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

到目前為止,我取得的成就是

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

給我

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

可以幫助我。

您正在尋找這樣的東西,

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

如果不能保證:term:definition的順序,則需要在原始哈希上對.map(&:sort)進行中間調用,並且:shift應該讀為:pop因為在排序后:definition s會出現:term

最簡單的解決方案:)

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])}

您的輸出將在result_hash中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM