在Ruby中转换哈希



输入

i = { :Narration=>"RI journal",
      :Status=>"DRAFT",
      :JournalLines=>{
        :JournalLine=>[
          { :credit=>{
              :LineAmount=>"10",
              :AccountCode=>"111",
              :Description=>"check cred"
            },
            :debit=>{
              :LineAmount=>"-10",
              :AccountCode=>"222"
            }
          },
          { :credit=>{
              :LineAmount=>"10",
              :AccountCode=>"333"
            },
            :debit=>{
              :LineAmount=>"-10",
              :AccountCode=>"444"
            }
          }
        ]
      }
    }

而不是"信用","借记",我只想简单地中的值。

预期输出:

{ :Narration=>"RI journal",
  :Status=>"DRAFT",
  :JournalLines=>
    { :JournalLine=>[
        {:LineAmount=>"10",  :AccountCode=>"111", :Description=>"check cred"},
        {:LineAmount=>"-10", :AccountCode=>"222"},
        {:LineAmount=>"10",  :AccountCode=>"333"},
        {:LineAmount=>"-10", :AccountCode=>"444"}
      ]
    }
}

这是我的代码,它有效。

arr = []
i[:JournalLines][:JournalLine].each do |h|
  h.each do |k, v|
   arr << v
  end
end

是否有更好的方法将输入替换两个循环的输入。

result = i.select {|k,_| [:Narration, :Status].include?(k)}
# => {:Narration=>"RI journal", :Status=>"DRAFT"} 
result[:JournalLines] = {:JournalLine => i[:JournalLines][:JournalLine].map{|hash| hash.flatten.select{|el| el.is_a?(Hash)}}.flatten}
result
# => {:Narration=>"RI journal", :Status=>"DRAFT", :JournalLines=>{:JournalLine=>[{:LineAmount=>"10", :AccountCode=>"111", :Description=>"check cred"}, {:LineAmount=>"-10", :AccountCode=>"222"}, {:LineAmount=>"10", :AccountCode=>"333"}, {:LineAmount=>"-10", :AccountCode=>"444"}]}}

这可以在适当的位置进行替换

2.2.2 :071 > i[:JournalLines].update(JournalLine: i[:JournalLines][:JournalLine].map(&:values).flatten)
=> {:JournalLine=>[{:LineAmount=>"10", :AccountCode=>"111", :Description=>"check cred"}, {:LineAmount=>"-10", :AccountCode=>"222"}, {:LineAmount=>"10", :AccountCode=>"333"}, {:LineAmount=>"-10", :AccountCode=>"444"}]}
2.2.2 :072 > i
=> {:Narration=>"RI journal", :Status=>"DRAFT", :JournalLines=>{:JournalLine=>[{:LineAmount=>"10", :AccountCode=>"111", :Description=>"check cred"}, {:LineAmount=>"-10", :AccountCode=>"222"}, {:LineAmount=>"10", :AccountCode=>"333"}, {:LineAmount=>"-10", :AccountCode=>"444"}]}}

确实与您的代码相同,但是从技术上讲,fp-fravory ...

arr = i[:JournalLines][:JournalLine].inject [] do |m, e|
  e.inject m do |m, (k, v)|
    m << v
  end
end

最新更新