Ruby:转换哈希键

Ruby:转换哈希键,ruby,Ruby,我有一个杂烩: urls = [{'logs' => 'foo'},{'notifications' => 'bar'}] 目标是为键添加前缀: urls = [{'example.com/logs' => 'foo'},{'example.com/notifications' => 'bar'}] 我的尝试: urls.map {|e| e.keys.map { |k| "example.com#{k}" }} 然后,我得到一个具有所需键形式的数组,但如何操作原始

我有一个杂烩:

urls = [{'logs' => 'foo'},{'notifications' => 'bar'}]
目标是为键添加前缀:

urls = [{'example.com/logs' => 'foo'},{'example.com/notifications' => 'bar'}]
我的尝试:

urls.map {|e| e.keys.map { |k| "example.com#{k}" }}

然后,我得到一个具有所需键形式的数组,但如何操作原始散列?

如果您没有访问
散列#转换(transform)键的权限
即Ruby<2.5.5这应该可以:

urls.map{ |h| a = h.to_a; { 'example.com/' + a[0][0] => a[0][1] } }
如果要“手动”转换键,则可以首先迭代哈希数组,然后在每个对象(每个哈希)上将其值映射到哈希,其中键内插有“example.com/”,且值保持不变:

urls.flat_map { |hash| hash.map { |key, value| { "example.com/#{key}" => value } } }
# [{"example.com/logs"=>"foo"}, {"example.com/notifications"=>"bar"}]
请注意URL是“平面映射”的,否则您将得到一个包含散列/E的数组数组

如果您希望简化这个过程,那么可以使用内置的方法来转换Ruby拥有的哈希中的键;:

使用

一个问题:在这里,使用一组哈希值是最好的,还是使用一个哈希值更好?例如:

urls = { 'logs' => 'foo', 'notifications' => 'bar' }
存储数据的方式似乎更合理一些。然后,说你仍然需要改变这些:

urls.transform_keys { |key| "example.com/#{key}" }
# => {"example.com/logs"=>"foo", "example.com/notifications"=>"bar"}
或从原始数组获取哈希输出:

urls = [{'logs' => 'foo'}, {'notifications' => 'bar'}]
urls.reduce({}, &:merge).transform_keys { |key| "example.com/#{key}" }

# => {"example.com/logs"=>"foo", "example.com/notifications"=>"bar"}

使用IMHO更容易:)

您没有散列。你有一个散列数组,单元素散列。如果这实际上是数据的存储方式,那么数组或散列都不是很好的用途,这表明这是一个XY问题,您应该询问如何生成结构,而不是如何操作键。“”此外,看起来您正在尝试构建主机名/路径或URL。如果是这样,请注意URI规范要求对某些字符进行编码,人们通常会弄错,然后想知道为什么他们的链接不起作用。Ruby的类提供了setter和getter,使创建正确字符串变得更容易,并且是生成字符串的简单、简单和正确的方法。同意原始数据不应该是散列数组,而应该是单个散列,因此我对OP的评论是,这是一个XY问题。
urls.transform_keys { |key| "example.com/#{key}" }
# => {"example.com/logs"=>"foo", "example.com/notifications"=>"bar"}
urls = [{'logs' => 'foo'}, {'notifications' => 'bar'}]
urls.reduce({}, &:merge).transform_keys { |key| "example.com/#{key}" }

# => {"example.com/logs"=>"foo", "example.com/notifications"=>"bar"}