2014-04-03 28 views
2

我有散列像这样检查是否定义了散列数组中某个键的值?

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

我想检查是否对于所有的元件或用于所述散列阵列中的特定键的值是零的阵列。

我知道你为一个单一的哈希做到这一点,像这样

hash.values.include? nil 

有不必通过数组ITER和检查每个哈希更好的办法?

+1

你所说的 “键值” 是什么意思?你是指所有哈希值? – sawa

回答

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

对于一个特定的键key

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

+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 
+0

第一个答案可能重复[在这里](http://stackoverflow.com/questions/22842932/check-if-values-for-a-key-in-a-array-of-hash-are-defined)。 –

+0

你可以这么说,只是试图阐述,解释和显示那里发生了什么。 @CarySwoveland –

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 
相关问题