Ruby 更新散列中的某些键

Ruby 更新散列中的某些键,ruby,hash,Ruby,Hash,我只想更新散列中的日期元素。 i、 e 我试过了 hash.select {|k,v| ['date_1','date_2'].include? k }.transform_values!(&:to_date) 但是因为我以前做过选择,所以它只会返回我 {'date_1':2017年1月31日星期二,'date_2':2017年1月31日星期二} 有没有关于保留其他属性以及变换选定关键点的建议 即{'name':'Albert','date_1':2017年1月31日星期二,'date

我只想更新散列中的日期元素。 i、 e

我试过了

hash.select {|k,v| ['date_1','date_2'].include? k }.transform_values!(&:to_date)
但是因为我以前做过选择,所以它只会返回我

{'date_1':2017年1月31日星期二,'date_2':2017年1月31日星期二}

有没有关于保留其他属性以及变换选定关键点的建议


即{'name':'Albert','date_1':2017年1月31日星期二,'date_2':2017年1月31日星期二}

只需更新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']
或者,如果您有更多的日期键,则可以使用
每个
执行此操作:

date_keys = [:date_1, :date_2]
hash.each do |k,v| 
  hash[k] = v.to_date if date_keys.include?(k)
end

如果您想要更具动态性的内容,而不必硬编码
date\u 1
date\u 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)>}
transform\u值
尝试就地修改一个只存在很短时间的哈希(由
select
返回的新哈希)<代码>转换值将获得完全相同的结果。

快速动态方式

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 }

将在任何包含
日期
的键上工作,如
日期
日期
日期
上个月

日期
键中的值上迭代要比在整个散列上迭代有效得多<代码>日期键。每个{124;键{124;散列[key]=散列[key]。如果散列[key]},则为日期键
。因为日期键是一个符号,所以对于每个要更改值的键,它应该是
date\u键=[:date\u 1,:date\u 2]
而不仅仅是
hash['date\u 1']=
?将键的名称从(例如)
:a
更改为
:b
哈希[:b]=hash.delete(:a)
(as
delete
返回
:a
的值)。
hash.select {|k,v| ['date_1','date_2'].include? k }.transform_values!(&:to_date)
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 }