Ruby - 更新哈希键以去除空格

时间:2018-05-23 14:56:50

标签: ruby

我想从哈希中删除空格,所以如果我有

{"my hash key": 12}

我想得到

{"myhashkey": 12}

我找到了一些方法来剥离这些值,但是在键上遇到了问题。我试过的时候

 my_hash.each_key{|k| k.gsub!(' ', '')}

我收到了错误:

RuntimeError: can't modify frozen String

如果只使用gsub(没有'!')它运行正常,但无法正常工作。

那么实现这一目标的最佳途径是什么?谢谢!

3 个答案:

答案 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的人偶然发现这个