2011-08-18 27 views
5

Voglio verificare se un hash ha una chiave che contiene del testo. Potrebbe non essere la chiave esatta, ma la chiave deve contenere (come il .include?) il testo. La mia soluzione è:Controllare se hash ha una chiave che contiene del testo

some_hash.select {|k,v| k.include? "foo"}.empty? 

Ma questo genererà un altro hash. Voglio solo verificare l'esistenza della chiave. C'è un modo migliore per farlo?

risposta

10

Questo sarebbe un po 'più bello:

some_hash.any? {|k, v| k.include? "foo"} 

("? Non l'hash ha le chiavi che comprendono 'foo'" Per me questa legge come )

In alternativa, questo può essere meno efficiente, ma effettivamente essere un po 'più efficiente (vedi commenti), e forse un po' più leggibile:

some_hash.keys.any? {|k| k.include? "foo"} 
+0

Fantastico! Grazie! –

+1

Quello medio non funziona, in quanto assegna un array chiave/valore a "chiave", e quindi ottieni Array.include ?, non String.include ?, che non esegue la corrispondenza parziale. Un rapido controllo dei tempi suggerisce che il tuo ultimo modo, che condivido sia più leggibile, è anche leggermente più veloce del tuo primo modo. –

+0

@glenn mcdonald: Ah! Che sarebbe stato un array k/v è stato il mio primo istinto, ma a causa di un felice incidente il mio caso di test ha funzionato :) Modificato, grazie/+ 1! – jtbandes

0

some_hash.any? {|k,v| k.include? "foo"}

5
some_hash.keys.any? {|k| k.include? 'foo' } 
Problemi correlati