确定哈希是否包含一组键中的任何键?

时间:2011-05-05 23:06:28

标签: ruby hash

你知道一个非常红宝石的方法来查找散列是否有某些键?

h = {:a => 1, :c => 3, :d => 4}
# keys to find are :a, :b or :e

我知道我可以做:

h.key?(:a) || h.key?(:b) || h.key?(:e)

但我想知道是否有更漂亮的方法来做到这一点! :)

非常感谢!

4 个答案:

答案 0 :(得分:36)

考虑Enumerable.any?

[:a, :b, :e].any? {|k| h.key?(k)}

来自IRB:

>> h = {:a => 1}; [:x].any? {|k| h.key?(k)}                    
=> false                                                                
>> h = {:a => 1}; [:x, :a].any? {|k| h.key?(k)}                
=> true

快乐的编码。

答案 1 :(得分:13)

以下是从阵列中获取所有匹配键的方法:

> {:a => 1, :c => 3, :d => 4}.keys & [:a, :d, :e]
 => [:a, :d] 

如果你想要一个布尔值(遵循安德鲁的建议):

> ({:a => 1, :c => 3, :d => 4}.keys & [:a, :d, :e]).empty?
 => false 
> ({:a => 1, :c => 3, :d => 4}.keys & [:f, :e]).empty?
 => true 

答案 2 :(得分:2)

我会做这样的事情:

[:a, :b, :e].any?{ |val| h.key?(val) } 

答案 3 :(得分:1)

h.select{|k| [:b, :w, :e].include?(k) }.empty?
h.select{|k| [:a, :w, :e].include?(k) }.empty?

你得到匹配键的哈希(键和值)(没有空?)