2013-10-02 11 views
9

Sto usando Ruby on Rails 3.2.13 e vorrei rimuovere le chiavi hash il cui valore hash corrispondente è vuoto. Cioè, se ho il seguente hashCome rimuovere le chiavi hash il cui valore hash è vuoto?

{ :a => 0, :b => 1, :c => true, :d => "", :e => " ", :f => nil } 

poi l'hash risultante deve essere (nota: 0 e true non sono considerate vuote)

{ :a => 0, :b => 1, :c => true } 

Come posso fare questo?

+0

Vuoi mantenere ': g => []' e 'h => {}'? –

risposta

22

Se utilizzando Rails è possibile provare

hash.delete_if { |key, value| value.blank? } 

o in caso di poco Rubino

hash.delete_if { |key, value| value.to_s.strip == '' } 
+3

'value.to_s.strip.empty?' Legge un po 'meglio di '==' '', IMO. Inoltre, non hai bisogno di Rails per avere 'vuoto?', Solo ActiveSupport. –

+0

e se il valore è un hash vuoto? o altro hash annidato è vuoto? –

1

Ci sono un certo numero di modi per eseguire questa operazione comune

rifiutano

Questo è quello che uso più spesso per ripulire gli hash perché è abbastanza corto, pulito e abbastanza flessibile per supportare qualsiasi condizionale e non muta l'oggetto originale. Ecco uno good article sui benefici dell'immutabilità nel rubino.

hash.reject {|_,v| v.blank?} 

Nota: La sottolineatura nell'esempio di cui sopra è usato per indicare che vogliamo disfare la tupla passato al proc, ma non stiamo utilizzando il primo valore (chiave).

rifiuto!

Tuttavia, se si vuole mutare l'oggetto originale:

hash.reject! {|_,v| v.blank?} 

selezionare

Al contrario, si utilizza selezionare che restituirà solo i valori che restituiscono vero quando valutata

hash.select {|_,v| v.present? } 

selezionare!

... e la versione mutando

hash.select {|_,v| v.present? } 

compatta

Infine, quando si solo bisogno di rimuovere le chiavi che hanno nil valori ...

hash.compact 

compatto!

Avete già raccolto il pattern, ma questa è la versione che modifica l'hash originale!

hash.compact! 
0

Per quanto riguarda la soluzione di techvineet, tenere presente quanto segue quando valore == [].

[].blank?    => true 
[].to_s.strip == ''  => false 
[].to_s.strip.empty? => false 
Problemi correlati