【问题标题】:Ruby: summing up values within an array of hashes between certain datesRuby:总结特定日期之间的哈希数组中的值
【发布时间】:2011-05-05 05:09:00
【问题描述】:

我在 Ruby 中有一个哈希数组:

array = [
  {:date => Wed, 04 May 2011 00:00:00 PDT -07:00,
   :value => 200}
  {:date => Wed, 04 May 2011 01:00:00 PDT -07:00,
   :value => 100}
  {:date => Tue, 03 May 2011 01:00:00 PDT -07:00,
   :value => 300}
  {:date => Tue, 03 May 2011 01:00:00 PDT -07:00,
   :value => 150}
]

我希望能够组合每天的值,这样我就有了一个像这样的新数组:

array = [
  {:date => Wed, 04 May 2011 00:00:00 PDT -07:00,
   :value => 300}
  {:date => Tue, 03 May 2011 00:00:00 PDT -07:00,
   :value => 450}
]

按天搜索数组并总结每一天的值的最优雅的方法是什么?

这是我最初尝试的:

entries = [
  {:date => Wed, 04 May 2011 00:00:00 PDT -07:00,
   :value => 200}
  {:date => Wed, 04 May 2011 01:00:00 PDT -07:00,
   :value => 100}
  {:date => Tue, 03 May 2011 01:00:00 PDT -07:00,
   :value => 300}
  {:date => Tue, 03 May 2011 01:00:00 PDT -07:00,
   :value => 150}
]

first_day = 29.days.ago.beginning_of_day
total_days = 30

day_totals = (0...total_days).inject([]) do |array, num|
    startat = first_day + num.day
    endat = startat.end_of_day

    total_value_in_day = entries.where("date >= ? and date <= ?", startat, endat).sum(:value)

    array << {:date => startat, :value => total_value_in_day}
end

我意识到我的错误在于 where 方法,这是一种用于搜索对象的 Rails 方法,不能用于数组。所以我的主要问题是,有没有办法根据条件搜索数组或哈希。

【问题讨论】:

  • 如果你不介意我优雅直率,最优雅的方式真的是你自己writesome code。代码的优雅是一种价值,达到它是件好事,但如果没有(痛苦的)练习,你就无法达到精通。也许read a good book
  • 编辑了帖子以显示我自己尝试的代码,以及我遇到的问题。
  • 5 月 3 日星期二的组合值 450 来自哪里?
  • 啊哈,现在问题好多了!
  • @sawa,哎呀,这是一个错字,刚刚修复

标签: ruby arrays hash


【解决方案1】:

您可以遍历条目以创建新数组:

totals = Hash.new(0)
array.each do |entry|
  totals[entry[:date]] += entry[:value]
end

# Now totals will be something like this:
# => {"Wed, 04 May 2011" => 300, "Tue, 03 May 2011" => 450...}

# If you then want this in the same array format you started with:
new_array = totals.collect{ |key, value| {:date => key, :value => value} }
# => [{:date => "Wed, 04 May 2011", :value => 300}, {....}]

【讨论】:

  • 这很棒!我还必须使用entry[:date].beginning_of_day 来添加一天中不同时间的条目。谢谢!
【解决方案2】:

对于 1.9.2:

>> array.each_with_object(Hash.new(0)) { |el, hash| hash[el[:date]] += el[:value] } 
#=> {"Wed, 04 May 2011 00:00:00 PDT -07:00"=>200, "Wed, 04 May 2011 01:00:00 PDT -07:00"=>100, "Tue, 03 May 2011 01:00:00 PDT -07:00"=>450}

也适用于 1.8:

>> array.inject(Hash.new(0)) { |hash, el| hash[el[:date]] += el[:value] ; hash } 
#=> {"Wed, 04 May 2011 00:00:00 PDT -07:00"=>200, "Wed, 04 May 2011 01:00:00 PDT -07:00"=>100, "Tue, 03 May 2011 01:00:00 PDT -07:00"=>450}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2020-10-09
    • 2017-12-11
    相关资源
    最近更新 更多