2012-07-19 8 views
43

ich nach einem besseren Weg suchen zu tunprüfen, ob ein Schlüssel des Hash enthalten alle eine Reihe von Tasten

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

vorzugsweise so etwas wie

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

ich mit

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

aber ich mag es nicht, das Array zweimal hinzufügen, obwohl

+1

Ehrfürchtig Antwort hier die keine Schleifen nicht verwendet : http://stackoverflow.com/a/4743729/238880 –

Antwort

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

Wenn Sie es komplizierter machen möchten, könnten Sie '[: a,: b,: c,: d] .alle? (& hash.method (:: Schlüssel?)) '. –

16

@ Weg Mori ist am besten, aber hier ist eine andere Art und Weise:

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

oder

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

Gerade im Geiste der TIMTOWTDI, hier ist eine andere Art und Weise. Wenn Sie require 'set' (im std lib), dann können Sie dies tun:

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

Ich mag diese Art und Weise, diese zu lösen:

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

Es ist schnell und klar.

+2

Funktioniert, es sei denn, man benötigt eine strikte Übereinstimmung. [: a,: b,: c,: d] & [: a,: b,: c,: d,: e] => [: a,: b,: c,: d] –

+3

Ja, allerdings Die Frage war nicht. –

3

Sie eine Liste der fehlenden Tasten auf diese Weise erhalten können:

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

Wenn Sie wollen einfach nur zu sehen, ob es irgendwelche fehlenden Tasten sind:

(expected_keys - hash.keys).empty? 
Verwandte Themen