如何在哈希中为每个键添加前缀?

Fen*_*nec 6 ruby

我的哈希中有以下键:

address, postcode
Run Code Online (Sandbox Code Playgroud)

我想为每个人添加"shipping_"前缀,以便它们成为:

shipping_address, shipping_postcode
Run Code Online (Sandbox Code Playgroud)

代替.我怎样才能做到这一点?

Aru*_*hit 9

hsh1 = {'address' => "foo", 'postcode' => "bar"}
hsh2 = Hash[hsh1.map{|k,v| [k.dup.prepend("shipping_"),v]}]
p hsh2
# >> {"shipping_address"=>"foo", "shipping_postcode"=>"bar"}
Run Code Online (Sandbox Code Playgroud)

更新

hsh1 = {'address' => "foo", 'postcode' => "bar"}
hsh2 = Hash[hsh1.map{|k,v| ["shipping_#{k}",v]}]
p hsh2
# >> {"shipping_address"=>"foo", "shipping_postcode"=>"bar"}
Run Code Online (Sandbox Code Playgroud)

  • 而不是`k.dup.prepend("shipping _")``让Ruby使用`"shipping _#{k}"`处理`dup.prepend`.发生了什么事情更加明显. (3认同)

San*_*osh 6

在 Ruby >= 2.5 中,你可以这样做

hsh.transform_keys! {|k| 'shipping_' + k }
# => {"shipping_address"=>"foo", "shipping_postcode"=>"bar"} 
Run Code Online (Sandbox Code Playgroud)

如果你想变得花哨

hsh.transform_keys! &'shipping_'.method(:+)
# => {"shipping_address"=>"foo", "shipping_postcode"=>"bar"} 
Run Code Online (Sandbox Code Playgroud)