我只想更新哈希中的日期元素。 即
hash = { 'name': 'Albert', 'date_1': "31-01-2017", 'date_2': "31-01-2017" }
## I only want to update `date_1` and `date_2`.
我试过了
hash.select {|k,v| ['date_1','date_2'].include? k }.transform_values!(&:to_date)
但是因为我之前做过选择,它只会给我回复
{ 'date_1': Tue, 31 Jan 2017, 'date_2': Tue, 31 Jan 2017 }
是否有任何建议要保留其他属性以及转换选定的密钥?
i.e. { 'name': 'Albert', 'date_1': Tue, 31 Jan 2017, 'date_2': Tue, 31 Jan 2017 }
答案 0 :(得分:2)
只需更新date_1和date_2的值:
hash['date_1'] = hash['date_1'].to_date if hash['date_1']
hash['date_2'] = hash['date_2'].to_date if hash['date_2']
如果您有更多日期键,则可以使用each
执行此操作:
date_keys = [:date_1, :date_2]
hash.each do |k,v|
hash[k] = v.to_date if date_keys.include?(k)
end
答案 1 :(得分:0)
如果您想要更动态的内容,而无需硬编码date_1
和date_2
:
require 'date'
hash = { name: 'Albert', date_1: "31-01-2017", date_2: "31-01-2017" }
hash.each do |key, value|
if key.to_s =~ /^date_/ && value.is_a?(String)
hash[key] = Date.strptime(value, '%d-%m-%Y')
end
end
p hash
#=> {:name=>"Albert", :date_1=>#<Date: 2017-01-31 ((2457785j,0s,0n),+0s,2299161j)>, :date_2=>#<Date: 2017-01-31 ((2457785j,0s,0n),+0s,2299161j)>}
请注意,对于您的代码:
hash.select {|k,v| ['date_1','date_2'].include? k }.transform_values!(&:to_date)
transform_values!
尝试修改一个只有短暂存在的哈希(select
返回的新哈希)。 transform_values
将获得完全相同的结果。
答案 2 :(得分:0)
快速动态方式
hash = { 'name' => 'Albert', 'date_1' => "31-01-2017", 'date_2' => "31-01-2017" }
hash.map { |k,v| hash[k] = k['date_'] ? v.to_date : v }
可以处理包含date_
的任何键,例如date_02
,date_1234
,date_lastmonth
等