2013-09-24 5 views

ответ

5

Использование Enumerable#flat_map:

years = [2013, 2012, 2011, 2010, 2009] 
years.flat_map { |year| 
    12.downto(1).map { |month| 
     sprintf("%04d-%02d", year, month) # OR "%04d-%02d" % [year, month] 
    } 
} 
# => ["2013-12", "2013-11", "2013-10", .., "2009-02", "2009-01"] 
+0

Что разница между картой и flat_map? –

+0

@stevanity, '[[1,2], [2,3]]. Map {| x | x}' дает '[[1, 2], [2, 3]]', а '[[1, 2], [2,3]]. Flat_map {| x | x} 'дает' [1, 2, 2, 3] '. Для получения дополнительной информации следуйте по ссылке в ответе. – falsetru

+2

'12.downto (1) .map' выглядит чище. – Stefan

8

Использование Array#product объединить годы и месяцы:

years = [2013, 2012, 2011, 2010, 2009] 
months = [*1..12].reverse 
#=> [12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1] 

years.product(months).map { |y, m| "%d-%02d" % [y, m] } 
#=> ["2013-12", "2013-11", "2013-10", "2013-09", "2013-08", "2013-07", "2013-06", "2013-05", "2013-04", "2013-03", "2013-02", "2013-01", "2012-12", "2012-11", "2012-10", "2012-09", "2012-08", "2012-07", "2012-06", "2012-05", "2012-04", "2012-03", "2012-02", "2012-01", "2011-12", "2011-11", "2011-10", "2011-09", "2011-08", "2011-07", "2011-06", "2011-05", "2011-04", "2011-03", "2011-02", "2011-01", "2010-12", "2010-11", "2010-10", "2010-09", "2010-08", "2010-07", "2010-06", "2010-05", "2010-04", "2010-03", "2010-02", "2010-01", "2009-12", "2009-11", "2009-10", "2009-09", "2009-08", "2009-07", "2009-06", "2009-05", "2009-04", "2009-03", "2009-02", "2009-01"] 
+1

Ха-ха украл шоу! : D –

+0

Ничего себе, это даже круче. Спасибо! Тем не менее, я использую 'months = (1..12) .to_a.reverse' для краткости. – Tintin81

+0

* + 1 * хотя ... это плохой 'years.product (months) .map {| a | a.join ("-")} '? –

0

заимствование из @Stefan,

years = [2013, 2012, 2011, 2010, 2009] 
years.map(&:to_s).product([*'-01'..'-12'].reverse).map(&:join) 
Смежные вопросы