简体   繁体   中英

Create key if it doesn't exist in nested hashes

I've been trying to figure out how to write this ruby code more eloquently. Does someone have a better solution?

a[:new] = {} if a[:new].nil?
a[:new].merge!( { new_key => new_value } )

is there a way to write this in a more elegant way? I come across this a lot when dealing with nested hashes that need to check whether an key exist and if not, create it.

Write it as below taking the help of Hash#to_h and NilClass#to_h

a[:new] = a[:new].to_h.merge( { new_key => new_value } )

Example :

hsh1[:a] # => nil
hsh1[:a] = hsh1[:a].to_h.merge({1=>2})
hsh1[:a] # => {1=>2}

hsh2 = {:a => {'k' => 2}}
hsh2[:a] # => {"k"=>2}
hsh2[:a] = hsh2[:a].to_h.merge({1=>2})
hsh2 # => {:a=>{"k"=>2, 1=>2}}

Do this at the beginning:

a = Hash.new{|h, k| h[k] = {}}

then, without caring whether a has a key :new or not, do

a[:new].merge!(new_key => new_value)

or

a[:new][new_key] = new_value

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM