检查是否定义了散列数组中键的值?

时间:2014-04-03 15:57:32

标签: ruby hash

我有一系列像这样的哈希

[ {a:nil,...}, {a:nil,...}, ... ]

我想检查哈希数组中所有元素或特定键的值是否为零。

我知道你这样做是为了一个像这样的哈希

hash.values.include? nil

有没有比通过数组并检查每个哈希更好的方法?

3 个答案:

答案 0 :(得分:7)

array.all?{|h| h.values.all?(&:nil?)}

对于特定键key

array.all?{|h| h[key].nil?}

答案 1 :(得分:1)

"有没有比迭代数组和检查每个哈希更好的方法?"

是的,您可以使用Ruby的Enumerable all? 来避免循环遍历数组并检查每个哈希。以下是两个例子:

1.9.3p286 :001 > a = [{:a=>nil, :b=>nil}, {:a=>nil, :c=>nil}, {:d=> 1, :e=>nil}]
 => [{:a=>nil, :b=>nil}, {:a=>nil, :c=>nil}, {:d=>1, :e=>nil}] 
1.9.3p286 :002 > a.all?{|h| h.values.all?(&:nil?)}
 => false 
1.9.3p286 :003 > a = [{:a=>nil, :b=>nil}, {:a=>nil, :c=>nil}]
 => [{:a=>nil, :b=>nil}, {:a=>nil, :c=>nil}] 
1.9.3p286 :004 > a.all?{|h| h.values.all?(&:nil?)}
 => true 

答案 2 :(得分:1)

这也有效,但我会推荐@ sawa的解决方案。

<强>代码

def all_nil?(array)
  array.flat_map(&:values).compact.empty?
end

def each_all_nil?(array)
  array.map { |h| h.values.compact.empty? }
end

<强>实施例

array = [{dog: nil, cat: nil, bird: nil}, {rhino: nil, dog: nil, bird: nil}]
all_nil?(array)              #=> true
each_all_nil?(array)         #=> [true, true]

array = [{dog: nil, cat: nil, bird: nil}, {rhino: nil, dog: "woof", bird: nil}]
all_nil?(array)              #=> false
each_all_nil?(array)         #=> [true, false]

<强>解释

array = [{dog: nil, cat: nil, bird: nil}, {rhino: nil, dog: "woof", bird: nil}]

all_nil?

a = array.flat_map(&:values) #=> [nil, nil, nil, nil, "woof", nil]
b = a.compact                #=> ["woof"]
b.empty?                     #=> false

each_all_nil?

映射array的第一个元素时:

a = array.first              #=> {:dog=>nil, :cat=>nil, :bird=>nil}
b = a.values                 #=> [nil, nil, nil]
c = b.compact                #=> []
c.empty?                     #=> true