输入
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