更新哈希中的某些键

时间:2017-01-29 08:03:18

标签: ruby hash

我只想更新哈希中的日期元素。 即

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 }

3 个答案:

答案 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_1date_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_02date_1234date_lastmonth