【问题标题】:Clear all values in nested ruby hash清除嵌套 ruby​​ 哈希中的所有值
【发布时间】:2014-03-10 14:50:20
【问题描述】:

如何从 ruby​​ 中删除所有值。我不想只删除键值。

例如:

这是我的哈希:{'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}}

我想要这个:{'a'=>{'b'=>nil},'d'=>nil,'f'=>{'g'=>nil}}

我不想删除嵌套的哈希。嵌套级别从一到六级不等

感谢

【问题讨论】:

  • 递归是我认为的唯一选择。

标签: ruby-on-rails ruby hash hashmap


【解决方案1】:
h = {'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}}

def cleaned_hash(h)
  h.reduce({}) do |memo, (key, val)|
    memo[key] = if val.is_a? Hash
                  cleaned_hash(val)
                else
                  nil
                end
    memo
  end
end

cleaned_hash h
# => {"a"=>{"b"=>nil}, "d"=>nil, "f"=>{"g"=>nil}}

这不会修改您的哈希值,而是为您提供干净的副本

【讨论】:

  • case for one expression is bad practice.
【解决方案2】:
h = {'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}}

def clean_hash h
 h.each do  |key, value| 
   if value.instance_of? Hash
     clean_hash value
   else
     h[key] = nil
   end
 end
end

clean_hash h
#{"a"=>{"b"=>nil}, "d"=>nil, "f"=>{"g"=>nil}}

【讨论】:

    【解决方案3】:

    您可以编写自定义delete_values! 方法,如下所示:

    class Hash
      def delete_values!
        each_key do |key|
          self[key].is_a?(Hash) ? self[key].delete_values! : self[key] = nil
        end
      end
    end
    
    {'a'=>{'b'=>'c'},'d'=>'e','f'=>{'g'=>''}}.delete_values!
    # => {"a"=>{"b"=>nil}, "d"=>nil, "f"=>{"g"=>nil}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 2013-12-17
      • 1970-01-01
      • 2020-02-14
      相关资源
      最近更新 更多