按星期分组在阵列ruby的第一列中

时间:2017-07-17 11:22:11

标签: ruby-on-rails ruby

我有下一个二维数组,其中第一个组件属于ActiveSupport :: TimeWithZone,第二个组件是字符串

[[Sun, 16 Jul 2017 14:41:56 -03 -03:00, "open"],
 [Sun, 16 Jul 2017 14:41:56 -03 -03:00, "closed"],
 [Sun, 16 Jul 2017 14:41:56 -03 -03:00, "closed"],
 [Mon, 10 Jul 2017 00:00:00 -03 -03:00, "open"],
 [Sun, 16 Jul 2017 14:45:31 -03 -03:00, "closed"],
 [Sun, 16 Jul 2017 14:44:41 -03 -03:00, "open"],
 [Sun, 16 Jul 2017 14:44:39 -03 -03:00, "closed"],
 [Sun, 16 Jul 2017 14:44:13 -03 -03:00, "open"],
 [Mon, 10 Jul 2017 00:00:00 -03 -03:00, "closed"],
 [Fri, 14 Jul 2017 00:00:00 -03 -03:00, "open"],
 [Mon, 17 Jul 2017 00:00:00 -03 -03:00, "open"]]

我需要以有效的方式将该数组转换为

{["09-Jul", "open"]=>2, ["16-Jul", "open"]=>1, ["09-Jul", "closed"]=>0, ["16-Jul", "closed"]=>1}

也就是说,我需要将第一个组件转换为格式%b-%d。此外,我需要按周和"状态"。最后,我需要计算这些分组值,并以哈希格式显示数据作为第二个例子

2 个答案:

答案 0 :(得分:2)

input.group_by { |d, v| [d.strftime('%b-%d'), v] }
     .map { |k, v| [k, v.count] }.to_h

另外,对于Ruby 2.4+,它可以简化(信用转到@MarkThomas):

input.group_by { |d, v| [d.strftime('%b-%d'), v] }
     .transform_values(&:count)

答案 1 :(得分:0)

您可以使用Hash::new形式创建所需的哈希值,该哈希值的参数等于哈希值的默认值,这里我们希望为零。这意味着如果定义h的哈希h = Hash.new(0)没有密钥k,那么h[k]将返回默认值(此处为0) ,而不修改散列h

input.each_with_object(Hash.new(0)) { |(d,v),h| h[[d.strftime('%b-%d'), v]] += 1