2016-06-28 137 views
0

输入红宝石转化哈希

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 

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

回答

0
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"}]}} 
0

这不到位的替代

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"}]}} 
0

真的一样你的代码,但在技术上略偏FP-味...

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