在哈希数组中使用 gsub

Using gsub in array of hashes

我想删除哈希中键值中的空格

output = [
  {"first name"=> "george", "country"=>"Australia"},
  {"second name"=> "williams", "country"=>"South Africa"},
  {"first name"=> "henry", "country"=>"US"}]

当数组中只有一个散列时,我能够使用以下代码进行管理

    Array.wrap({}.tap do |hash|
     output.each do |key|
      key.each do |k, v|
       hash[k.gsub(" ","_")] = v
      end
     end
    end)

请帮我修改包含多个哈希的数组。

注意:输出值是动态的,我们不能在代码中硬编码哈希键。

下面的代码会将散列中每个键的空格更改为下划线:

output.flat_map { |h| h.map { |key, v| { key.gsub(" ", "_") => v } } }
=> [{"first_name"=>"george"}, {"country"=>"Australia"}, {"second_name"=>"williams"}, {"country"=>"South Africa"}, {"first_name"=>"henry"}, {"country"=>"US"}]

如果哈希没有嵌套 - 你可以简单地

output.map{|h| h.each_pair.map{|k,v| [k.gsub(' ', '_'), v]}.to_h }

您不能修改散列的键。您必须删除不需要的密钥并添加一个新密钥。这是一种一步完成这两个操作的方法(请参阅文档 Hash#delete):

def convert(h) 
  h.keys.each { |k| (h[k.tr(' ','_')] = h.delete(k)) if k =~ /\s/ }
  h
end

因此:

output.map { |h| convert h }
  #=> [{"country"=>"Australia", "first_name"=>"george"},
  #    {"country"=>"South Africa", "second_name"=>"williams"},
  #    {"country"=>"US", "first_name"=>"henry"}]

我也用过String#tr to convert spaces to underscores, but you could use String#gsub这个方法。另外,您可以写 k.include?(' ') 而不是 k =~ /\s/.