使用Month作为键从Date对象数组创建哈希

时间:2014-02-24 19:18:24

标签: ruby

从Date对象数组创建哈希的最有效方法是什么,其中月份是键,值是日期数组?目前,我有以下几点。

require 'date'

...
start, finish = args.start, args.end # Assume this has been implemented
date_map = {}
(start..finish).map do |date|
    unless date_map.has_key? date.month then date_map[date.month] = [date]
    else date_map[date.month] << date end
end

是否有更有效的方法来完成上述代码块?

2 个答案:

答案 0 :(得分:5)

您可以使用Enumerable#group_by

(start..finish).group_by(&:month)

答案 1 :(得分:2)

编辑:刚刚看到@Kyle的回答。很难改进。

您可以像这样编写代码:

date_map = Hash.new { |h,k| h[k] = [] }
start.upto(finish) { |date| date_map[date.month] << date }

或更紧凑:

date_map = start.upto(finish).with_object(Hash.new { |h,k] h[k] = [] }) \
  { |date, h| h[date.month] << date }

你也会看到这样做:

date_map = start.upto(finish).with_object({}) { |date, h| 
  (h[date.month] ||= []) << date }