【问题标题】:Merge 2 Hash and create third new Hash in Ruby 2.6.3在 Ruby 2.6.3 中合并 2 个哈希并创建第三个新哈希
【发布时间】:2021-02-02 06:12:26
【问题描述】:

我希望从以下两个哈希中创建一个新的哈希。

invoiced_data =
  {"Jan 2020"=>0, "Feb 2020"=>0, "Mar 2020"=>0, "Apr 2020"=>0,
   "May 2020"=>0, "Jun 2020"=>0, "Jul 2020"=>0.331027548e7,
   "Aug 2020"=>0.31668664e6, "Sep 2020"=>0, "Oct 2020"=>0,
   "Nov 2020"=>0, "Dec 2020"=>0}

payment_transaction_data =
  {"Jul 2020"=>400.0, "Aug 2020"=>26924.0}

后一个哈希的所有键都是前一个哈希的键。后一个哈希可能为空。

我希望构造的哈希与invoiced_data 具有相同的键。这些键的值是带有键:Invoiced_data:payment_transaction_type 的哈希值。 :Invoiced_data 的值将是给定键的invoiced_data 的值,:payment_transaction_type 的值将是给定键的payment_transaction_data 的值,如果键存在,否则为零。我需要的结果如下。

{"Jan 2020": {Invoiced_data: 0, payment_transaction_data: 0},        
 "Feb 2020": {Invoiced_data: 0, payment_transaction_data: 0},         
 "Mar 2020": {Invoiced_data: 0, payment_transaction_data: 0},             
 "Apr 2020": {Invoiced_data: 0, payment_transaction_data: 0},        
 "May 2020": {Invoiced_data: 0, payment_transaction_data: 0},         
 "Jun 2020": {Invoiced_data: 0, payment_transaction_data: 0},        
 "Jul 2020": {Invoiced_data: 3310275.48, payment_transaction_data: 400.0},
 "Aug 2020": {Invoiced_data: 316686.64, payment_transaction_data: 26924.0},
 "Sep 2020": {Invoiced_data: 0, payment_transaction_data: 0},        
 "Oct 2020": {Invoiced_data: 0, payment_transaction_data: 0},        
 "Nov 2020": {Invoiced_data: 0, payment_transaction_data: 0},        
 "Dec 2020": {Invoiced_data: 0, payment_transaction_data: 0}}     

【问题讨论】:

  • 我相信您会批准我的编辑,但请不要犹豫回滚或重新编辑。你说(原文如此),“我想用Invoiced_data 的所有键创建新哈希,因为payment_transaction_data 可能没有[Invoiced_data] 的所有键”。我假设你的意思是payment_transaction_data 没有不是Invoiced_data 的键的键,但我可能是错的,因为某些答案显然解释为意味着payment_transaction_data 可能有不是Invoiced_data 的键的键,其中如果返回的哈希应该包括这些键。如果我有误解,请编辑。

标签: ruby-on-rails ruby hash merge


【解决方案1】:

我很确定它可能会更优化,但更快的解决方案:

a
=> {"Jan 2020"=>0, "Feb 2020"=>0, "Mar 2020"=>0, "Apr 2020"=>0, "May 2020"=>0, "Jun 2020"=>0, "Jul 2020"=>3310275.48, "Aug 2020"=>316686.64, "Sep 2020"=>0, "Oct 2020"=>0, "Nov 2020"=>0, "Dec 2020"=>0}

b
=> {"Jul 2020"=>400.0, "Aug 2020"=>26924.0}

a.map do |k, v|
  [k, { Invoiced_data: v || 0, payment_transaction_data: b[k] || 0 }]
end.to_h
=> {"Jan 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0}, "Feb 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0}, "Mar 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0}, "Apr 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0}, "May 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0}, "Jun 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0}, "Jul 2020"=>{:Invoiced_data=>3310275.48, :payment_transaction_data=>400.0}, "Aug 2020"=>{:Invoiced_data=>316686.64, :payment_transaction_data=>26924.0}, "Sep 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0}, "Oct 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0}, "Nov 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0}, "Dec 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0}}

【讨论】:

    【解决方案2】:
    invoiced_data = {'Jun 2020' => 0.3310273458e7, 'Jul 2020' => 0.331027548e7, 'Aug 2020' => 0.31668664e6}
    payment_transaction_data = {'Jul 2020' => 400, 'Aug 2020' => 26924.0, 'Sep 2020' => 25834.0}
    
    hash = {}
    (invoiced_data.keys | payment_transaction_data.keys).each do |key|
      hash[key] = {}
      hash[key][:invoiced_data] = invoiced_data[key] || 0.0
      hash[key][:payment_transaction_data] = payment_transaction_data[key] || 0
    end
    

    然后

    puts hash # {"Jun 2020"=>{:invoiced_data=>3310273.458, :payment_transaction_data=>0},
     "Jul 2020"=>{:invoiced_data=>3310275.48, :payment_transaction_data=>400}, 
     "Aug 2020"=>{:invoiced_data=>316686.64, :payment_transaction_data=>26924.0}, 
     "Sep 2020"=>{:invoiced_data=>0.0, :payment_transaction_data=>25834.0}}
    

    【讨论】:

      【解决方案3】:

      试试下面的:

      invoice_data = {"Jan 2020"=>0, "Feb 2020"=>0, "Mar 2020"=>0, "Apr 2020"=>0, "May 2020"=>0, "Jun 2020"=>0, "Jul 2020"=>0.331027548e7, "Aug 2020"=>0.31668664e6, "Sep 2020"=>0, "Oct 2020"=>0, "Nov 2020"=>0, "Dec 2020"=>0}
      transaction_data = {"Jul 2020"=>400.0, "Aug 2020"=>26924.0}
      
      
      {}.tap do |result|
        keys = invoice_data.keys + transaction_data.keys
        keys.uniq.each do |key|
          result[key] ||= {}
          result[key][:invoice_data] = invoice_data[key] || 0
          result[key][:transaction_data] = transaction_data[key] || 0
        end
      end
      

      结果:

       => {"Jan 2020"=>{:invoice_data=>0, :transaction_data=>0}, "Feb 2020"=>{:invoice_data=>0, :transaction_data=>0}, "Mar 2020"=>{:invoice_data=>0, :transaction_data=>0}, "Apr 2020"=>{:invoice_data=>0, :transaction_data=>0}, "May 2020"=>{:invoice_data=>0, :transaction_data=>0}, "Jun 2020"=>{:invoice_data=>0, :transaction_data=>0}, "Jul 2020"=>{:invoice_data=>3310275.48, :transaction_data=>400.0}, "Aug 2020"=>{:invoice_data=>316686.64, :transaction_data=>26924.0}, "Sep 2020"=>{:invoice_data=>0, :transaction_data=>0}, "Oct 2020"=>{:invoice_data=>0, :transaction_data=>0}, "Nov 2020"=>{:invoice_data=>0, :transaction_data=>0}, "Dec 2020"=>{:invoice_data=>0, :transaction_data=>0}} 
      

      【讨论】:

        【解决方案4】:

        你可以这样做。

        invoiced_data.each_with_object({}) { |(k,v),h| h[k] = { Invoiced_data: v,
          payment_transaction_data: payment_transaction_data.fetch(k,0) } }
          #=> {"Jan 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0},
          #    "Feb 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0},
          #    "Mar 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0},
          #    "Apr 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0},
          #    "May 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0},
          #    "Jun 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0},
          #    "Jul 2020"=>{:Invoiced_data=>3310275.48,
          #                 :payment_transaction_data=>400.0},
          #    "Aug 2020"=>{:Invoiced_data=>316686.64,
          #                 :payment_transaction_data=>26924.0},
          #    "Sep 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0},
          #    "Oct 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0},
          #    "Nov 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0},
          #    "Dec 2020"=>{:Invoiced_data=>0, :payment_transaction_data=>0}}
        

        Hash#fetch

        【讨论】:

          猜你喜欢
          • 2017-12-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-02
          • 1970-01-01
          • 1970-01-01
          • 2012-01-14
          相关资源
          最近更新 更多