【问题标题】:Get set of hashes from array of hashes between two date values从两个日期值之间的哈希数组中获取一组哈希
【发布时间】:2016-10-04 10:43:26
【问题描述】:

我有一个包含日期和总键的哈希数组。

例如:

hash = [{
  "Date"=>"01/01/2016",
  "Total"=>10
},{
  "Date"=>"02/01/2016",
  "Total"=>20
},{
  "Date"=>"03/01/2016",
  "Total"=>30
},{
  "Date"=>"04/01/2016",
  "Total"=>40
},{
  "Date"=>"05/01/2016",
  "Total"=>50
}]

我想要做的是将两个日期传递给一个方法,然后只返回日期匹配或在两个日期之间的哈希值。

例如:

get_data(startDate, endDate)

end

其中 startDate 和 endDate 是 '02/01/206' 和 04/01/2016

会返回:

{
  "Date"=>"02/01/2016",
  "Total"=>20
},{
  "Date"=>"03/01/2016",
  "Total"=>30
},{
  "Date"=>"04/01/2016",
  "Total"=>40
}

【问题讨论】:

  • hash 可能不是数组的最佳名称。 ??????

标签: ruby-on-rails ruby hash


【解决方案1】:
def get_data(start_date, end_date, hash)
  hash.select{|entry| entry["Date"].to_date.between?(start_date.to_date, end_date.to_date) }
end

【讨论】:

    【解决方案2】:

    我赞同@Steve 的回答,但想指出您可以使用 Ruby 有点晦涩的flip-flop operator

    下面,arr 是您示例中的哈希数组。

    require 'date'
    
    h = arr.each_with_object({}) { |g,h| h[Date.strptime(g["Date"], '%d/%m/%Y')] = g }
      #=> {#<Date: 2016-01-01 ((2457389j,0s,0n),+0s,2299161j)>=>
      #      {"Date"=>"01/01/2016", "Total"=>10},
      #    #<Date: 2016-01-02 ((2457390j,0s,0n),+0s,2299161j)>=>
      #      {"Date"=>"02/01/2016", "Total"=>20},
      #    #<Date: 2016-01-03 ((2457391j,0s,0n),+0s,2299161j)>=>
      #      {"Date"=>"03/01/2016", "Total"=>30},
      #    #<Date: 2016-01-04 ((2457392j,0s,0n),+0s,2299161j)>=>
      #      {"Date"=>"04/01/2016", "Total"=>40},
      #    #<Date: 2016-01-05 ((2457393j,0s,0n),+0s,2299161j)>=>
      #      {"Date"=>"05/01/2016", "Total"=>50}}  
    
    range =  Date.strptime('02/01/2016', '%d/%m/%Y')..Date.strptime('04/01/2016', '%d/%m/%Y')
      #=> #<Date: 2016-01-02 ((2457390j,0s,0n),+0s,2299161j)>..
      #   #<Date: 2016-01-04 ((2457392j,0s,0n),+0s,2299161j)> 
    

    触发器运算符用于确定落在给定范围内的键:

    keeper_keys = h.keys.sort.select { |d| range.include?(d) .. true ? true : false }
      #=> [#<Date: 2016-01-02 ((2457390j,0s,0n),+0s,2299161j)>,
      #    #<Date: 2016-01-03 ((2457391j,0s,0n),+0s,2299161j)>,
      #    #<Date: 2016-01-04 ((2457392j,0s,0n),+0s,2299161j)>]
    
    h.select { |k,_| keeper_keys.include?(k) }.values
      #=> [{"Date"=>"02/01/2016", "Total"=>20},
      #    {"Date"=>"03/01/2016", "Total"=>30},
      #    {"Date"=>"04/01/2016", "Total"=>40}] 
    

    【讨论】:

      猜你喜欢
      • 2012-08-17
      • 2013-01-23
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 2017-02-16
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多