2012-07-19 53 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?