在散列数组中使用gsub

时间:2016-03-31 13:34:57

标签: arrays ruby hash gsub

我想删除散列中键值中的空格

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)

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

注意:输出值是动态的,我们无法对代码中的哈希键进行硬编码。

3 个答案:

答案 0 :(得分:1)

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

for(int i=0; i<1000 && !token.IsCancellationRequested; ++i)
{
    ...
}

// output log if cancelled
if (token.IsCancellationRequested) Console.WriteLine(...);

答案 1 :(得分:0)

这里的代码将把哈希中每个键的空格更改为下划线:

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"}]

答案 2 :(得分:0)

您无法修改哈希的键。您必须删除不需要的密钥并添加新密钥。这是一种在一个步骤中执行这两项操作的方法(请参阅文档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将空格转换为下划线,但您也可以使用String#gsub。此外,您可以写k.include?(' ')而不是k =~ /\s/