检查两个键值对的散列是否仅包含错误值

时间:2016-03-04 09:23:53

标签: ruby-on-rails ruby

我想知道,确定具有2个键/值对的散列是否只包含错误值的最简单方法是什么

hash = {key1: false, key2: false}

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

提前致谢!

5 个答案:

答案 0 :(得分:6)

my_hash.values.uniq == [false]

my_hash.invert.keys == [false]

答案 1 :(得分:4)

这也可以是一个选项

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的答案

答案 2 :(得分:2)

假设哈希值不能是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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

两个键的最简单方法:

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

一个缺点:也会为true值返回nil