我有一个哈希:
industries = {'consultancy_services' => 0, 'manufacturing' => 1, 'retailing_services' => 2}
如果有一个下划线,我想用下划线拆分,每个得到的元素我想要大写。
有没有比这更好的方法:
Hash[industries.map { |k,v| [k.to_str.split('_').map(&:capitalize).join(' '), k] }]
V有用的回复,谢谢。 #humanize似乎是最好的方式,如下所示:
industries.map {|k,_| k.humanize }.to_h
答案 0 :(得分:3)
你可以省略to_str
,因为你的密钥仍然是字符串。 (此外,Ruby核心库中除了String
之外没有其他类实现to_str
,所以如果键不是字符串,那么你将获得异常。)
此外,您可以将v
阻止参数重命名为_
,因为您没有使用它。 _
和v
的名称一样有效,但这是一个向其他程序员说的约定"我没有使用这个东西",并且Ruby工具知道这个惯例,例如不生成"未使用的变量"警告。
最后,您可以使用Array#to_h
代替Hash::[]
。
industries.map {|k, _| [ k.split('_').map(&:capitalize).join(' '), k] }.to_h
#=> { 'Consultancy Services' => 'consultancy_services', 'Manufacturing' => 'manufacturing', 'Retailing Services' => 'retailing_services' }
如果您有权访问ActiveSupport,则可以使用ActiveSupport::Inflector::titleize
:
require 'active_support/inflector'
industries.map {|k, _| [ ActiveSupport::Inflector.titleize(k), k] }.to_h
答案 1 :(得分:0)
industries
.keys
.group_by{|k| k.gsub(/[^_]+/, &:capitalize).tr("_", " ")}
.transform_values(&:first)
结果:
{
"Consultancy Services"=>"consultancy_services",
"Manufacturing"=>"manufacturing",
"Retailing Services"=>"retailing_services"
}