【问题标题】:omitting empty values while creating hash创建哈希时省略空值
【发布时间】:2013-02-13 15:17:10
【问题描述】:

我创建了一个包含许多键的哈希,我想省略具有nil 值的键:

h = {
  :key0 => val0,
  :key1 => val1, # I want to include this key only if val1 is not nil
  :key2 => val2
}

除了

,还有什么好方法吗?
if val1
  h = {
    :key0 => val0,
    :key1 => val1,
    :key2 => val2
  }
else
  h = {
    :key0 => val0,
    :key2 => val2
  }
end

类似的东西

h = {
  :key0 => val0,
  :key1 => val1 if val1, # gives an error
  :key2 => val2
}

编辑:感谢到目前为止的回复,真的很有用。有没有一种方法可以定义哈希文字而无需事后处理?

【问题讨论】:

标签: ruby


【解决方案1】:

你可以试试Hash#keep_if 方法。该方法从 hsh 中删除块评估为 false 的每个键值对。

h = { :key0 => 'val0',:key1 => nil,:key2 => 'val2',:key4 =>nil}


h.keep_if {|key,value| !value.nil?}

{:key0=>"val0", :key2=>"val2"}

【讨论】:

    【解决方案2】:

    “delete_if”方法可以通过屈服于块来删除某些元素。如果该块为某个元素返回 true,则该元素将被删除。然后,您的代码应如下所示,以便删除值为 nil 的元素:

    val0 = true
    val1 = nil
    val2 = true
    
    h = {
      :key0 => val0,
      :key1 => val1, # I want to include this key only if val1 is not nil
      :key2 => val2
    }
    
    h.delete_if{ |key, val| val.nil? }
    
    puts h #=> {:key0=>true, :key2=>true}
    

    【讨论】:

      【解决方案3】:

      最简单的方法是进行选择:

      { :key0 => 1, :key1 => nil }.select {|_,v| v } 
      #=> { :key0 => 1 }
      

      在这种情况下,如果 v 为“假”(falsenil),则省略该对。

      【讨论】:

        猜你喜欢
        • 2015-11-21
        • 2017-05-04
        • 1970-01-01
        • 2013-12-20
        • 1970-01-01
        • 1970-01-01
        • 2021-06-19
        • 1970-01-01
        • 2014-11-17
        相关资源
        最近更新 更多