【问题标题】:Generate a Key, Value JSON object from a Ruby Object Array从 Ruby 对象数组生成键、值 JSON 对象
【发布时间】:2018-05-21 19:00:57
【问题描述】:

我有一个 students 的 Ruby 数组。 Student 类具有属性idnameage

students = [ 
             {id:"id1",name:"name1",age:"age1"}, 
             {id:"id2",name:"name2",age:"age2"},
             {id:"id3",name:"name3",age:"age3"}
           ]

我想从这个数组创建一个 JSON 键值对象,如下所示。

json_object = {id1:name1, id2:name2, id3:name3}

【问题讨论】:

    标签: ruby-on-rails arrays json ruby


    【解决方案1】:

    您的数据都是相同的,但如果您想生成一个以 students[n][:id] 的值作为键和 students[n][:name] 作为值的哈希,您可以这样做:

    student_ids_to_names = students.each_with_object({}) do |student, memo|
      memo[student[:id]] = student[:name]
    end
    

    对于您的数据,您最终只会得到一个条目,因为学生是相同的:{ "id1" => "name1" }。如果数据不同,:id 上的每个键都是唯一的。

    获得哈希后,您可以调用 json_object = students_ids_to_names.to_json 来获取 JSON 字符串。

    【讨论】:

    • 对于可变累加器,首选 each_with_object 而不是 inject
    【解决方案2】:

    试一试:

    students = [ 
                 {id:"id1",name:"name1",age:"age1"}, 
                 {id:"id2",name:"name2",age:"age2"},
                 {id:"id3",name:"name3",age:"age3"}
               ]
    
    json_object = students.each_with_object({}) do |hsh, returning|
      returning[hsh[:id]] = hsh[:name]
    end.to_json
    

    在控制台中:

    puts json_object
     => {"id1":"name1","id2":"name2","id3":"name3"}
    

    【讨论】:

      【解决方案3】:
      input = [ {id:"id1",name:"name1",age:"age1"},
                {id:"id2",name:"name2",age:"age2"},
                {id:"id3",name:"name3",age:"age3"}]
      
      require 'json'
      JSON.dump(input.map { |hash| [hash[:id], hash[:name]] }.to_h)
      #⇒ '{"id1":"name1","id2":"name2","id3":"name3"}'
      

      【讨论】:

      • 哇。我不知道您可以像在数组数组上那样使用.to_h。超好!你能评论JSON.dump.to_json吗?
      • @jvillian 当然。我不相信猴子补丁。 to_json 可能被明确阻止/覆盖/无论如何。
      • @mudasobwa 这是 Ruby 上下文中的猴子补丁吗?或者这也适用于 Rails (Hash#to_json)?
      • @jemonsanto 当然有to_json in the ruby core。问题是 Rails 或任何广泛覆盖/monkeypatch 默认 Ruby 实现的人,而我需要的是来自 ruby​​ 核心的旧好。
      • @mudasobwa Neato!感谢您的解释,没有看到替代方式(doh)。只是略过。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多