我想从哈希中删除空格,所以如果我有
{"my hash key": 12}
我想得到
{"myhashkey": 12}
我找到了一些方法来剥离这些值,但是在键上遇到了问题。我试过的时候
my_hash.each_key{|k| k.gsub!(' ', '')}
我收到了错误:
RuntimeError: can't modify frozen String
如果只使用gsub(没有'!')它运行正常,但无法正常工作。
那么实现这一目标的最佳途径是什么?谢谢!
答案 0 :(得分:6)
哈希中的键被冻结(如错误消息所示),因此无法修改 inplace 。必须使用新密钥构造新哈希:
{"my hash key" => 12}.map { |k, v| [k.delete(' '), v] }.to_h
#⇒ {"myhashkey"=>12}
NB!有一个陷阱:你可能会失去一些价值!
{"a b c" => 42, "abc" => :foo}.
map { |k, v| [k.delete(' '), v] }.to_h
#⇒ {"abc"=>:foo}
答案 1 :(得分:5)
您可以使用transform_keys
:
my_hash = { 'my hash key': 12 }
#=> {:"my hash key"=>12}
my_hash.transform_keys { |k| k.to_s.delete(' ').to_sym }
#=> {:myhashkey=>12}
需要进行to_s
/ to_sym
转换,因为Symbol
未实现delete
。如果您的密钥实际上是字符串,则可以省略它:
my_hash = { 'my hash key' => 12 }
#=> {:"my hash key"=>12}
my_hash.transform_keys { |k| k.delete(' ') }
#=> {:myhashkey=>12}
答案 2 :(得分:2)
尝试以下方法:
h = { "my hash key": 12 }
h.map {|key, value| [key.to_s.delete(' '), value] }.to_h
基本上,您将哈希映射到一个新数组,在该数组中删除所有空格(这是key.to_s.delete(' ')
所做的),然后将其转换回.to_h
的哈希:)
修改强>
刚刚看到@ stephen的答案,它使用了transform_keys
,这是Ruby 2.5中引入的一种更简单的方法。
然而,我仍然会留下我的答案,以防任何使用以前版本的Ruby的人偶然发现这个