【问题标题】:array of hashes as hash key and value as array using jbuilder使用 jbuilder 将哈希数组作为哈希键并将值作为数组
【发布时间】:2017-09-14 06:10:28
【问题描述】:

我正在尝试使用 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"
}

可以帮我解决这个问题。

【问题讨论】:

    标签: ruby-on-rails ruby jbuilder


    【解决方案1】:

    最简单的解决方案:)

    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 中

    【讨论】:

    • 它可能更短:words.each_with_object({}){|x, acc| (acc[x[:term]] ||= []) << x[:definition]},但 OP 要求 jbuilder 解决方案。
    【解决方案2】:

    你正在寻找这样的东西,

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

    【讨论】:

    • 我们可以用 jbuilder 做同样的事情吗?
    【解决方案3】:
    words.group_by{|d| d[:term]}.map{|k,v| {k => v.map{|val| val[:definition]}}}.reduce(&:merge)
    

    【讨论】:

      【解决方案4】:
      words.map(&:values).group_by(&:shift).each do |k, values|
        json.set! k, values.flatten
      end
      

      如果不能保证:term:definition 的顺序,则会在所需的原始哈希上对.map(&amp;:sort) 进行中间调用,并且:shift 应读取为:pop,因为在对:definition 进行排序之后s 将在 :terms 之前。

      【讨论】:

        猜你喜欢
        • 2012-10-29
        • 2019-10-27
        • 2017-05-11
        • 2019-05-23
        • 2020-07-02
        • 2013-07-03
        • 2014-12-04
        • 1970-01-01
        相关资源
        最近更新 更多