在创建哈希时省略空值

时间:2013-02-27 17:31:59

标签: ruby

我创建了一个包含许多键的哈希,我想省略具有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
}
编辑:感谢到目前为止的回复,非常有用。有没有办法定义哈希文字而不必事后处理它?<​​/ p>

3 个答案:

答案 0 :(得分:4)

您可以尝试使用Hash#keep_if方法。该方法从hsh中删除每个键值对,其中块的计算结果为false。

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


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

{:key0 =&gt;&#34; val0&#34;,:key2 =&gt;&#34; val2&#34;}

答案 1 :(得分:0)

“delete_if”-method可以通过屈服于一个块来删除某些元素。如果该块对元素返回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}

答案 2 :(得分:0)

最简单的方法是选择:

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

在这种情况下,如果v为'falsey'(falsenil),则该对将被省略。