2012-07-19 30 views
43

我正在寻找一个更好的方式做检查哈希的键包括所有的一组键的

if hash.key? :a && 
    hash.key? :b && 
    hash.key? :c && 
    hash.key? :d 

最好类似

hash.includes_keys? [ :a, :b, :c, :d ] 

我想出了

hash.keys & [:a, :b, :c, :d] == [:a, :b, :c, :d] 

但我不喜欢不得不添加阵列两次,虽然

+1

真棒这里的答案不使用任何循环:http://stackoverflow.com/a/4743729/238880 – 2013-06-27 15:08:19

回答

82
[:a, :b, :c, :d].all? {|s| hash.key? s} 
+2

如果你想使它更复杂,你可以使用'[:a,:b,:c,:d] .all?(&hash.method(:钥匙?))'。 – 2016-08-23 21:11:13

16

@森的方式是最好的,但这里的另一种方式:

([:a, :b, :c, :d] - hash.keys).empty? 

hash.slice(:a, :b, :c, :d).size == 4 
11

就在TIMTOWTDI的精神,这里是另一种方式。如果您require 'set'(在标准库),那么你可以这样做:

Set[:a,:b,:c,:d].subset? hash.keys.to_set 
5

我喜欢这样的方式来解决这个问题:

subset = [:a, :b, :c, :d] 
subset & hash.keys == subset 

它是快速和清晰。

+2

工作除非需要严格匹配。 [:a,:b,:c,:d]&[:a,:b,:c,:d,:e] – 2015-05-21 22:49:42

+3

然而,问题不在于此。 – 2015-05-23 08:51:49

3

你可以得到丢失的钥匙的名单是这样的:

expected_keys = [:a, :b, :c, :d] 
missing_keys = expected_keys - hash.keys 

如果你只是想看看是否有任何丢失的钥匙:

(expected_keys - hash.keys).empty?