2017-07-17 55 views
0

我有下一个二维阵列,其中所述第一componente属于的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。另外,我需要按周和“地位”分组。最后,我需要计算这些分组值,并作为第二个例子是哈希格式呈现数据

+1

你有什么低效的方法? –

回答

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) 
+0

可以用'.transform_values(&:count)'在Rails 4.2 + –

+1

@MarkThomas中替换'map'和'to_h'我是一个毕业的Rails-hater。 – mudasobwa

+0

...或[Ruby 2.4+](https://ruby-doc.org/core-2.4.0/Hash.html#method-i-transform_values):-) –

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