我有一系列像这样的哈希
[ {a:nil,...}, {a:nil,...}, ... ]
我想检查哈希数组中所有元素或特定键的值是否为零。
我知道你这样做是为了一个像这样的哈希
hash.values.include? nil
有没有比通过数组并检查每个哈希更好的方法?
答案 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