如何将以下数组转换为哈希?

时间:2011-11-23 14:18:55

标签: ruby ruby-on-rails-3

(3.years.ago.to_date..Date.today).map { |date| [date.month, date.year] }.uniq!

返回:

[[11, 2008], [12, 2008], [1, 2009], [2, 2009], [3, 2009], [4, 2009], [5, 2009], [6, 2009], [7, 2009], [8, 2009], [9, 2009], [10, 2009], [11, 2009], [12, 2009], [1, 2010], [2, 2010], [3, 2010], [4, 2010], [5, 2010], [6, 2010], [7, 2010], [8, 2010], [9, 2010], [10, 2010], [11, 2010], [12, 2010], [1, 2011], [2, 2011], [3, 2011], [4, 2011], [5, 2011], [6, 2011], [7, 2011], [8, 2011], [9, 2011], [10, 2011], [11, 2011]]

如何将此变为具有此结构的哈希:

[
  [month => 11, year => 2008], 
  [month => 12, year => 2008], 
  [month => 1, year => 2009],
  etc
]

所以我可以像:

一样使用它
foo.first.month # returns 11
foo.first.year # returns 2008

3 个答案:

答案 0 :(得分:2)

(3.years.ago.to_date..Date.today).map {|date| {:month => date.month, :year => date.year}}
=> [{:month=>11, :year=>2008}, {:month=>11, :year=>2008}, {:month=>11, :year=>2008}...]

然而,问题在于你不会免费获得这些方法。您必须在Hash上覆盖method_missing,以便为方法提供密钥。

class Hash
  def method_missing(method_name, *args)
    if key?(method_name)
      self[method_name]
    else
      super
    end
  end
end

答案 1 :(得分:0)

require 'openstruct'
array = (3.years.ago.to_date..Date.today).map { |date| [date.month, date.year] }.uniq
array.map {|ary| OpenStruct.new([:month, :year].zip(ary))}

答案 2 :(得分:0)

这个问题需要工作,因为你的预期结果没有意义:

你没有哈希,你有一个数组数组......带有键值对(你可以通过索引访问数组,而不是通过键访问数组)。但是键是对不存在的月份和年份对象的引用(我假设你想让它们成为字符串或符号)。然后你也想像对象一样访问它们而不是哈希(即array.first.month vs array.first[:month])。

但无论如何,由于日期对象已经出现月份和年份方法,因此您无需对这些做任何特殊操作。您只需要将一个块传递给uniq,告诉它您正在使用的标准:

(3.years.ago.to_date..Date.today).to_a.uniq { |date| [date.month, date.year] }