我有下一个二维数组,其中第一个组件属于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。此外,我需要按周和"状态"。最后,我需要计算这些分组值,并以哈希格式显示数据作为第二个例子
答案 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