2013-10-02 8 views
9

Ich benutze Ruby on Rails 3.2.13 und ich möchte Hash Keys entfernen, die entsprechenden Hash-Wert ist leer. Das heißt, wenn ich die folgende HashWie entfernt man Hash-Schlüssel, deren Hash-Wert leer ist?

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

dann die resultierenden Hash haben sollten (Note: 0 und true sind nicht leer betrachtet)

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

Wie kann ich das machen?

+0

Haben Sie behalten möchten ': g => []' und 'h => {}'? –

Antwort

22

Bei der Verwendung von Rails Sie

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

oder im Fall von nur Rubin

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

'value.to_s.strip.empty?' Liest ein bisschen besser als '== ''', IMO. Außerdem brauchen Sie Rails nicht leer zu haben, nur ActiveSupport. –

+0

Was ist, wenn der Wert ein Hash ist, der leer ist? oder ist weiter verschachtelter Hash leer? –

1

Es gibt eine Reihe von Möglichkeiten, können versuchen, diese gemeinsame Aufgabe

ablehnen

zu erreichen Dies ist die eine, die ich am häufigsten für die Reinigung von Hashes verwende, da sie kurz, sauber und flexibel genug ist Unterstützung für alle bedingten und mutiert nicht das ursprüngliche Objekt. Hier ist ein good article über die Vorteile der Unveränderlichkeit in Rubin.

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

Hinweis: Der Unterstrich in dem obigen Beispiel verwendet, um anzuzeigen, dass wir das Tupel des proc weitergegeben auspacken wollen, aber wir sind nicht mit dem ersten Wert (key).

ablehnen!

Wenn Sie jedoch das ursprüngliche Objekt mutieren wollen:

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

wählen

Im Gegensatz dazu verwenden Sie wählen, welche nur die Werte zurück, die true zurück, wenn

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

wählen!

... und das Mutieren Version

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

compact

Schließlich, wenn Sie nur brauchen Schlüssel zu entfernen, die nil Werte haben ...

hash.compact 

kompakt!

Sie haben das Muster inzwischen aufgenommen, aber das ist die Version, die den ursprünglichen Hash ändert!

hash.compact! 
0

In Bezug auf Techvineet-Lösung beachten Sie Folgendes, wenn Wert == [].

[].blank?    => true 
[].to_s.strip == ''  => false 
[].to_s.strip.empty? => false 
Verwandte Themen