2017-01-29 4 views
2

ハッシュで日付要素を更新したいだけです。 すなわち特定のキーをハッシュで更新する

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

値を変更するキーごとに 'hash ['date_1'] = 'だけでなく、キーの名前を ':a'から':b'に変更するには: 'hash [:b] = hash.delete(:a)'( 'delete'は':a'の値を返します) 。 –

答えて

2

だけDATE_1と日付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

ハッシュ全体を反復処理するのではなく、 'date_keys'の値を反復処理する方がはるかに効率的です。 'date_keys.each {| key |ハッシュ[キー] =ハッシュ[キー] .to_date if hash [キー]} '。 – meagar

+0

date_keysはシンボルなので、 'date_keys = [:date_1、:date_2]' –

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) 

のみ短命である代わりにハッシュ(selectによって返された新しいハッシュ)を変更しようとtransform_values!transform_valuesと同じ結果が得られます。

関連する問題