【问题标题】:How to convert flat hash into nested after conditional key?如何将平面散列转换为条件键后的嵌套?
【发布时间】:2015-04-17 15:29:31
【问题描述】:

我正在尝试将 xml 转换为 json 结构。我得到了所有行,首先提取作为标题并将其与所有下一行一起压缩,但是我必须在 word 属性之后嵌套键,怎么做?

当前步骤:

变量:

header = ["id",
 "groupName",
 "words",
 "Unit",
 "Name",
 "Image"]

rows = [["1",
  "gr 1",
  nil,
  "1",
  "Test",
  "test.png"],
 ["1",
  "gr 1",
  nil,
  "23",
  "Taefawe",
  "adf.png"]]

当前输出 =>

[{"id"=>"1",
  "groupName"=>"Unit 1",
  "words"=>nil,
  "Unit"=>"1",
  "Name"=>"Test",
  "Image"=>"test.png"},
 {"id"=>"1",
  "groupName"=>"gr 1",
  "words"=>nil,
  "Unit"=>"23",
  "Name"=>"Taefawe",
  "Image"=>"adf.png"}]

想要的:

[{"id"=>"1",
  "groupName"=>"Unit 1",
  "words"=>{
    "Unit"=>"1",
    "Name"=>"Test",
    "Image"=>"test.png"
  }
 },
 {"id"=>"1",
  "groupName"=>"gr 1",
  "words"=> {
    "Unit"=>"23",
    "Name"=>"Taefawe",
    "Image"=>"adf.png"
  }}]

当前代码:

rows = doc.sheets.first.rows
header = rows.shift

out = []
rows.each do |row|
  out << Hash[header.zip(row.map{|val| val})]
end

【问题讨论】:

    标签: ruby-on-rails ruby json hash


    【解决方案1】:

    如果您将其作为真正的 xml 恢复,您应该可以使用:

    Hash.from_xml(doc.sheets)
    

    【讨论】:

      【解决方案2】:

      如果您的标题始终不变,我认为最好的方法是:

      rows.inject([]) do |res, row|
        res << {"id" => row[0],
                "groupName" => row[1],
                "words" => {
                              "Unit" => row[3],
                              "Name"  => row[4],
                              "Image" => row[5]} 
               }
      end
      

      或者您也可以将hash 中的key 常量替换为header[index]

      【讨论】:

        猜你喜欢
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多