【问题标题】:Convert row of string dates to array of Date objects将字符串日期行转换为 Date 对象数组
【发布时间】:2014-09-26 16:05:27
【问题描述】:

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

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) }

感谢任何输入。

编辑:

作为一名编码新手,我将不胜感激有关此解决方案的替代方法的任何意见!

【问题讨论】:

  • ...您的解决方案似乎也有效,您认为它有什么问题?
  • 你的问题是什么?
  • changed_arraychanged_date有什么区别?
  • @sawa 这是一个错字。没有编辑也包括一个问题。如果有人知道为什么给它一个-1,请告诉我为什么!输入非常有用,所以感谢您抽出宝贵时间!

标签: ruby arrays string date null


【解决方案1】:

类似于 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)>]

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

    • 不需要两次迭代[array.flatten.map { |d| Date.parse(d) if d }]
    • @Зелёный - 在他的预期结果中,OP 使用 only due[2](数组的最后一个元素)
    猜你喜欢
    • 2013-01-02
    • 2017-11-11
    • 2020-05-21
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多