如何将平面哈希转换为嵌套的条件键?

时间:2015-04-17 15:29:31

标签: ruby-on-rails ruby json hash

我试图将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

2 个答案:

答案 0 :(得分:2)

如果你把它作为真正的xml取回,你应该可以使用:

Hash.from_xml(doc.sheets)

答案 1 :(得分:1)

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

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

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