将字符串日期行转换为Date对象数组

时间:2014-08-04 08:17:05

标签: ruby arrays string date null

我有一个包含一些零值的二维数组。

require 'date'
array = [["2014-01-12", "2014-01-12", "2014-01-12"],
          ["2012-08-26", "2012-10-18", nil],
          ["2013-04-09", "2013-05-22", "2013-07-01"]]

所需的结果是日期对象数组。生成的数组应如下所示 (用于显示目的的日期对象):

changed_array = [#<Date: 2014-01-12 ((2456874j,0s,0n),+0s,2299161j)>, nil, #<Date: 2012-07-31 ((2456874j,0s,0n),+0s,2299161j)>]

我考虑过这样的事情:

changed_array = array.map { |due| (Date.strptime(due[2], "%Y-%m-%d")) unless (due[2] == nil) }

赞赏任何意见。

编辑:

作为编码的新手,我将非常感谢有关此解决方案的替代方法的任何意见!

2 个答案:

答案 0 :(得分:2)

与Uri的解决方案类似,但只有一个map

array.map {|*_, d| Date.parse(d) if d}
# => [#<Date: 2014-01-12 ((2456670j,0s,0n),+0s,2299161j)>, nil, #<Date: 2013-07-01 ((2456475j,0s,0n),+0s,2299161j)>]

答案 1 :(得分:1)

如果您希望将最后一个元素解析为日期,则可以执行以下操作:

changed_date = array.map(&:last).map { |d| Date.parse(d) if d }
# => [#<Date: 2014-01-12 ((2456670j,0s,0n),+0s,2299161j)>, nil, #<Date: 2013-07-01 ((2456475j,0s,0n),+0s,2299161j)>] 

第一个map只接受每个数组的最后一个元素,第二个解析日期,除非它是nil