创建日期数组和这些日期的计数

时间:2016-03-14 14:17:36

标签: ruby-on-rails arrays ruby

我正在尝试创建一个可以传递给GCharts的数组,以显示日期与日期发生的次数。

我可以创建一个hash,但是如何创建一个包含日期和计数的简单数组。

我尝试将代码转换为数组(to_a),但数组太嵌套了。 @results是一个活动的记录关系,它包含一系列记录。

@values =  @results.map{|x| [x.start_time.strftime('%F')]}.reduce(Hash.new(0)) { |a, b| a[b] += 1; a }

Hash (5 elements)
["2016-03-07"] = 3
["2016-03-06"] = 4
["2016-03-05"] = 10
["2016-03-04"] = 1
["2016-03-03"] = 22

但我想要一个这样的数组:数组中的每个元素都应该有2个元素。

[0] should have ["2016-03-07"][3]
[1] should have ["2016-03-06"][4]
[2] should have ["2016-03-05"][10]

这是我想要的数组,但我只需要执行日期计数并将计数作为数组中的第二个元素:

@results.map{|x| [x.start_time.strftime('%F'), x.build_number]}

我就是这样做的,我相信没有循环就有更好的方法:

builds_per_day =  @results.map{|x| [x.start_time.strftime('%F')]}.reduce(Hash.new(0)) { |a, b| a[b] += 1; a }

    @array_of_builds_per_day =[]
    builds_per_day.each do |key, value|
      @array_of_builds_per_day<< [key[0].to_s,value]
      end

为混乱道歉

2 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解了您的问题,但如果我这样做,我相信打电话给__会产生类似

的内容
[["2016-03-07",3],["2016-03-06", 4]]

你想要

["2016-03-07",3,"2016-03-06", 4]

代替? 如果是这样,调用.to_a.flatten就是你想要的

答案 1 :(得分:0)

我无法正确理解你的问题,但如果你想要

{"2016-03-13"=>19, "2016-03-14"=>1}

而不是

{["2016-03-13"]=>19, ["2016-03-14"]=>1}

试试这个:

@results.map{|x| x.start_time.strftime('%F')}.reduce(Hash.new(0)) { |a, b| a[b] += 1; a }

<强>更新

使用新信息,此代码应该完成这项工作:

@results.group_by{|x| x.start_time.strftime('%F')}.map{|k,v| [[k], [v.size]] }

它将返回类似

的内容
[ 
  [["2016-03-13"], [19]], 
  [["2016-03-14"], [1]]
]