散列数组作为散列键,值作为数组使用jbuilder

时间:2017-09-14 06:10:28

标签: ruby-on-rails ruby 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"
}

有些人可以帮我解决这个问题。

4 个答案:

答案 0 :(得分:0)

您正在寻找类似的内容,

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

答案 1 :(得分:0)

words.group_by{|d| d[:term]}.map{|k,v| {k => v.map{|val| val[:definition]}}}.reduce(&:merge)

答案 2 :(得分:0)

words.map(&:values).group_by(&:shift).each do |k, values|
  json.set! k, values.flatten
end

如果无法保证:term:definition的顺序,则需要对原始哈希值进行.map(&:sort)的中间调用,:shift应该被视为{ {1}}因为排序后:pop s将在:definition s之前。

答案 3 :(得分:0)

最简单的解决方案:)

<div class="le-form">
  <form method="POST">
    <div class="le-input">
      <div class="upholder"></div>
      <input class="inpt" type="text" name="name" placeholder="Your name">
    </div>
    <div class="le-input">
      <div class="upholder"></div>
      <input class="inpt" type="email" name="_replyto" placeholder="Your e-mail address">
    </div>
    <div class="le-input">
      <div class="upholder"></div>
      <input class="inpt" type="text" name="phone" placeholder="Your phone number">
    </div>
    <input type="submit" value="Send" class="form-btn">
  </form>
</div>

您的输出将在result_hash