2012-07-19 9 views
43

Sto cercando un modo migliore per fareVerificare se le chiavi di un hash includono tutte una serie di chiavi

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

preferibilmente qualcosa di simile

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

mi si avvicinò con

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

ma non mi piace dover aggiungere l'array due volte se

+1

risposta impressionante qui, che non fa uso di alcun loop : http://stackoverflow.com/a/4743729/238880 –

risposta

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

Se vuoi renderlo più complicato, puoi usare '[: a,: b,: c,: d] .all? (& hash.method (: chiave?)) '. –

16

@ modo di Mori è la migliore, ma qui è un altro modo:

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

o

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

Proprio nello spirito di TIMTOWTDI, Ecco un altro modo. Se require 'set' (nel lib std), allora si può fare questo:

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

Mi piace questo modo per risolvere questo:

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

È veloce e chiaro.

+2

Funziona a meno che non si abbia bisogno di una corrispondenza rigorosa. [: a,: b,: c,: d] & [: a,: b,: c,: d,: e] => [: a,: b,: c,: d] –

+3

Sì, tuttavia la domanda non riguardava questo. –

3

È possibile ottenere un elenco di chiavi mancanti in questo modo:

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

Se si desidera solo per vedere se ci sono eventuali chiavi mancanti:

(expected_keys - hash.keys).empty? 
Problemi correlati