如何最好地映射split capitalize并加入hash的键

时间:2017-05-30 10:38:15

标签: ruby hash

我有一个哈希:

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

2 个答案:

答案 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"
}