我有散列像这样检查是否定义了散列数组中某个键的值?
[ {a:nil,...}, {a:nil,...}, ... ]
我想检查是否对于所有的元件或用于所述散列阵列中的特定键的值是零的阵列。
我知道你为一个单一的哈希做到这一点,像这样
hash.values.include? nil
有不必通过数组ITER和检查每个哈希更好的办法?
我有散列像这样检查是否定义了散列数组中某个键的值?
[ {a:nil,...}, {a:nil,...}, ... ]
我想检查是否对于所有的元件或用于所述散列阵列中的特定键的值是零的阵列。
我知道你为一个单一的哈希做到这一点,像这样
hash.values.include? nil
有不必通过数组ITER和检查每个哈希更好的办法?
array.all?{|h| h.values.all?(&:nil?)}
对于一个特定的键key
:
array.all?{|h| h[key].nil?}
+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
第一个答案可能重复[在这里](http://stackoverflow.com/questions/22842932/check-if-values-for-a-key-in-a-array-of-hash-are-defined)。 –
你可以这么说,只是试图阐述,解释和显示那里发生了什么。 @CarySwoveland –
这也适用,尽管我会推荐@ 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
你所说的 “键值” 是什么意思?你是指所有哈希值? – sawa