我有一个二维数组。
array = [["2014-01-12", "2014-01-12", "2014-01-12"],
["2012-08-26", "2012-10-18", "2012-08-31"],
["2013-04-09", "2013-05-22", "2013-07-01"]]
我需要在每个子阵列的第三个值中添加31天(例如:" 2014-01-12"&" 2012-08-31"&&# 34; 2012-07-01")
我考虑过这样的事情:
changed_date = array.map { |due| ((Date.strptime(due[2], "%Y-%m-%d"))+ 31) }
但是想看看有什么其他方法可以做到这一点......
谢谢!
编辑:
我需要将结果作为一个字符串数组,其中row.last还有31天。生成的数组应如下所示:
array = ["2014-02-12", "2012-09-31", "2012-08-31"]
答案 0 :(得分:2)
正如你所说,我正在写作..但你的方式是完美的。
#!/usr/bin/env ruby
require 'date'
array = [["2014-01-12", "2014-01-12", "2014-01-12"],
["2012-08-26", "2012-10-18", "2012-08-31"],
["2013-04-09", "2013-05-22", "2013-07-01"]]
p array.map { |a| Date.parse(a[2]).next_day(31) }
# => [#<Date: 2014-02-12 ((2456701j,0s,0n),+0s,2299161j)>,
# #<Date: 2012-10-01 ((2456202j,0s,0n),+0s,2299161j)>,
# #<Date: 2013-08-01 ((2456506j,0s,0n),+0s,2299161j)>]
此方法相当于d + n。
答案 1 :(得分:1)
你做得对,但你正在改变阵列形式。也许你应该做
array.map{ |due| due[2] = (Date.strptime(due[2]) + 31).strftime("%Y-%m-%d"); due }
或者
array.each{ |due| due[2] = (Date.strptime(due[2]) + 31).strftime("%Y-%m-%d"); }
答案 2 :(得分:1)
您编写changed_date = array.map..
并且显然希望changed_map
成为字符串数组的事实,您似乎希望该方法是非破坏性的;也就是说,保持array
不变。如果是这种情况,@ konsolebox的答案需要稍微修改一下:
array.map{ |row|
row[0..-2] << (Date.strptime(row.last) + 31).strftime("%Y-%m-%d") }
#=> [["2014-01-12", "2014-01-12", "2014-02-12"],
# ["2012-08-26", "2012-10-18", "2012-10-01"],
# ["2013-04-09", "2013-05-22", "2013-08-01"]]
array
#=> [["2014-01-12", "2014-01-12", "2014-01-12"],
# ["2012-08-26", "2012-10-18", "2012-08-31"],
# ["2013-04-09", "2013-05-22", "2013-07-01"]]
可替换地,
t = array.transpose
#=> [["2014-01-12", "2012-08-26", "2013-04-09"],
# ["2014-01-12", "2012-10-18", "2013-05-22"],
# ["2014-01-12", "2012-08-31", "2013-07-01"]]
(t[0..-2] << t.last.map { |d| (Date.strptime(d) + 31).strftime("%Y-%m-%d") })
.transpose
#=> [["2014-01-12", "2014-01-12", "2014-02-12"],
# ["2012-08-26", "2012-10-18", "2012-10-01"],
# ["2013-04-09", "2013-05-22", "2013-08-01"]]