Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何将哈希键从'Symbol'更改为'String's?_Ruby On Rails_Ruby_Ruby On Rails 3_Hash - Fatal编程技术网

Ruby on rails 如何将哈希键从'Symbol'更改为'String's?

Ruby on rails 如何将哈希键从'Symbol'更改为'String's?,ruby-on-rails,ruby,ruby-on-rails-3,hash,Ruby On Rails,Ruby,Ruby On Rails 3,Hash,我使用的是RubyonRails 3.2.2,我想“轻松”/“快速”将哈希键从Symbols更改为Strings。也就是说,从{:one=>“Value 1”、:two=>“Value 2”、…}到{“one=>“Value 1”、“two”=>“Value 2”、…} 我如何通过尽可能少地使用代码来实现这一点?使用stringify\u键/stringify\u键哈希类的方法 您还可以使用some\u hash.with\u interference\u access返回一个散列实例,在该实例

我使用的是RubyonRails 3.2.2,我想“轻松”/“快速”将哈希键从
Symbol
s更改为
String
s。也就是说,从
{:one=>“Value 1”、:two=>“Value 2”、…}
{“one=>“Value 1”、“two”=>“Value 2”、…}


我如何通过尽可能少地使用代码来实现这一点?

使用
stringify\u键
/
stringify\u键哈希类的方法

您还可以使用
some\u hash.with\u interference\u access
返回一个散列实例,在该实例中,您的密钥可以指定为符号,也可以指定为无差异的字符串

 new_hash = Hash.new
 your_hash.each{ |k,v| new_hash[k.to_s] = v }

新的\u散列将与您的\u散列相同,但使用字符串键

只需调用
stringify\u键
(或
stringify\u键!


有一个很好的库可以实现这一功能,该库是“facets/hash/rekey” 方法是rekey!。请参阅下面的示例,了解如何使用它。这只是过去的一个副本

> require 'facets/hash/rekey'
 => true
> a = {:one => "Value 1", :two => "Value 2"}
 => {:one=>"Value 1", :two=>"Value 2"} 
> a.rekey!(&:to_s)
 => {"one"=>"Value 1", "two"=>"Value 2"} 
> a
 => {"one"=>"Value 1", "two"=>"Value 2"}
从轨道上串接_键


stringify\u keys
很好,但仅在Rails中可用。 以下是我将如何在一行中完成它,并且没有依赖关系:

new_hash=hash[你的_hash.collect{k,v |[k.to_s,v]}]
这适用于Ruby 1.8.7及更高版本。 如果您使用的是Ruby 2.1,则可以执行以下操作:

new_hash=a.collect{k,v}[k.to_s,v]}.to_h

请注意,此解决方案不是递归的,也不会正确处理“重复”键。例如,如果哈希中有
:key
“key”
作为键,则最后一个将优先并覆盖第一个。

我来这里是想看看是否有比以下更好的方法:

JSON.parse(hash.to_json)

但是我想我会坚持我所拥有的。

您可以明确地将密钥从符号转移到字符串:

hash=hash.map{k,v|[k.to_s,v]}.to_h
hash=hash.transform_key(&:to_s)
将符号中的所有键转换为字符串

详情如下:


这是在ruby 2.5中添加的:

如果您使用HashWithInferenceAccess而不是hash,那么这将自动为您完成。
deep\u stringify\u keys
是递归的,但我相信它只适用于Rails 4:只适用于Rails项目。请小心使用此策略,因为它还会将任何符号值转换为字符串。这不会进行深度转换
JSON.parse(hash.to_json)