我有一个包含一些零值的二维数组。
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) }
赞赏任何意见。
编辑:
作为编码的新手,我将非常感谢有关此解决方案的替代方法的任何意见!
答案 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
。