簡體   English   中英

對哈希數組中的下一個哈希值求和

[英]Sum the next value of hash in an array of hashes

我有這樣一個哈希數組:

[{Mon, 09 May 2016 14:49:17 UTC +00:00=>12}, 
{Sun, 17 Apr 2016 14:08:40 UTC +00:00=>30}, 
{Sun, 16 Apr 2016 14:08:40 UTC +00:00=>18}, 
{Sun, 15 Apr 2016 14:03:33 UTC +00:00=>21}]

如何將最舊日期到當前日期的先前值相加,我的預期輸出將是:

[{Mon, 09 May 2016 14:49:17 UTC +00:00=>81}, 
{Sun, 17 Apr 2016 14:08:40 UTC +00:00=>69}, 
{Sun, 16 Apr 2016 14:08:40 UTC +00:00=>39}, 
{Sun, 15 Apr 2016 14:03:33 UTC +00:00=>21}]

謝謝!

假設數組中每個哈希的鍵都是DateTime對象,則可以通過以下操作獲得所需的內容:

balance = [
  {DateTime.parse('Mon, 09 May 2016 14:49:17 UTC +00:00')=>12}, 
  {DateTime.parse('Sun, 17 Apr 2016 14:08:40 UTC +00:00')=>30}, 
  {DateTime.parse('Sun, 16 Apr 2016 14:08:40 UTC +00:00')=>18}, 
  {DateTime.parse('Sun, 15 Apr 2016 14:03:33 UTC +00:00')=>21}
] # => your original array     

# Get expected array.
balance.map{ |h| 
  { 
    h.keys.first => balance.select{ |e| 
                      e.keys.first <= h.keys.first }.map{ |s| 
                        s[s.keys.first] }.reduce(:+) 
  } 
} 

我將代碼分成幾行以提高可讀性。

另一種方法是先sort數組sort ,然后使用map函數保持運行總計以收集所需數據。

# sort the balances by date
balance = balance.sort {|a, b| a.keys.first <=> b.keys.first }

# get running total and collect for each date
total = 0
balance.map do |entry|
  date, value = entry.first
  total += value
  {date => total}
end

我假設您的數組的排列順序是最新的,並且看起來像下面的arr

a = [{ "Mon, 09 May 2016 14:49:17 UTC +00:00"=>12 }, 
     { "Sun, 17 Apr 2016 14:08:40 UTC +00:00"=>30 }, 
     { "Sun, 16 Apr 2016 14:08:40 UTC +00:00"=>18 }, 
     { "Sun, 15 Apr 2016 14:03:33 UTC +00:00"=>21 }]

require 'date'
arr = a.map do |h|
  (d, v) = h.to_a.first
  { DateTime.parse(d) => v }
end
  #=> [{#<DateTime: 2016-05-09T14:49:17+00:00 ((2457518j,53357s,0n),+0s,2299161j)>=>12},
  #    {#<DateTime: 2016-04-17T14:08:40+00:00 ((2457496j,50920s,0n),+0s,2299161j)>=>30},
  #    {#<DateTime: 2016-04-16T14:08:40+00:00 ((2457495j,50920s,0n),+0s,2299161j)>=>18},
  #    {#<DateTime: 2016-04-15T14:03:33+00:00 ((2457494j,50613s,0n),+0s,2299161j)>=>21}] 

然后我們可以如下計算所需的數組。

cumv = 0
arr.reverse.
    map { |h| h.to_a.first }.
    each_with_object([]) do |(d,v),a|
      cumv += v
      a << { d => cumv }
    end.
    reverse
  #=> [{#<DateTime: 2016-05-09T14:49:17+00:00 ((2457518j,53357s,0n),+0s,2299161j)>=>81},
  #    {#<DateTime: 2016-04-17T14:08:40+00:00 ((2457496j,50920s,0n),+0s,2299161j)>=>69},
  #    {#<DateTime: 2016-04-16T14:08:40+00:00 ((2457495j,50920s,0n),+0s,2299161j)>=>39},
  #    {#<DateTime: 2016-04-15T14:03:33+00:00 ((2457494j,50613s,0n),+0s,2299161j)>=>21}] 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM