检查两个键值对的哈希是否仅包含假值



我想知道,如果具有 2 个键/值对的哈希仅包含假值,最简单的方法是什么

hash = {key1: false, key2: false}

我如何在某种情况下检查这一点。我知道all?但我很好奇是否会有更简单的东西,因为它只有 2 个值。

提前感谢!

my_hash.values.uniq == [false]

my_hash.invert.keys == [false]
这也

是一种选择

hash = old_hash.dup
hash.delete_if {|x,v| v == false} == {}

我做的基准测试

hash = {key1: false, key2: false, key3: false, key4: false}
n = 100000
Benchmark.bm do |x|
  x.report do
    n.times do
      hash.values.uniq == [false] 
    end
  end
end
 #  user     system      total        real
 #  0.110000   0.000000   0.110000 (  0.103477)

hash = {key1: false, key2: false, key3: false, key4: false}
n = 100000
Benchmark.bm do |x|
  x.report do
    n.times do
      hash.delete_if {|x,v| v == false} == {}
    end
  end
end
   # user     system      total        real
   # 0.030000   0.000000   0.030000 (  0.026449)

但是,我相信代码应该尽可能更具可读性,所以我会推荐 @Cary Swoveland 的答案

hash.values.uniq.length == 1 && hash.values.uniq.include?(false)

假设哈希值不能nil(这是假的):

hash.values.none?

或者,为了精确检查false,而不是falsey

hash.values.all? { |e| e == false } # this works with `nil`s properly

或:

!hash.values.reduce(&:|)

或(只是出于好奇):

hash.values.uniq.tap do |a| 
  raise if a.pop == false && a.empty?
end.first rescue true

或:

hash.values == [false] * hash.size

两个键的最简单方法:

!(hash[:key1] || hash[:key2])
#=> true

一个缺点:对于nil值,也会返回true

最新更新