【问题标题】:Using gsub in array of hashes在哈希数组中使用 gsub
【发布时间】:2016-03-31 13:34:56
【问题描述】:

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

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)

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

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

【问题讨论】:

  • 提到的数组在代码中不能很好地工作
  • 它只适用于 [{"first name" => "George", "country" => "Australia"}]

标签: arrays ruby hash gsub


【解决方案1】:

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

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

【讨论】:

  • 整个哈希被数组包裹
  • 请注意,它是一个哈希数组
  • user3636388,我希望@Vasfed 意识到这一点,但问题的本质是如何在哈希键中“删除空格”。一旦您知道如何为一个散列执行此操作,您显然只需映射数组,转换每个(散列)元素。如果您将其限制在单个哈希中,这个问题会更好。但是,您是 Ruby 新手,所以您没有这样做是可以理解的。
【解决方案2】:

以下代码会将哈希中每个键的空格更改为下划线:

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

【讨论】:

    【解决方案3】:

    您不能修改散列的键。您必须删除不需要的密钥并添加一个新密钥。这是一步完成这两项操作的一种方法(请参阅文档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/

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 2010-12-11
      • 2011-07-26
      • 2021-02-05
      相关资源
      最近更新 更多