在哈希数组中使用 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/
.
我想删除哈希中键值中的空格
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/
.