2013-10-02 19 views
9

Używam Ruby na Railsach 3.2.13 i chciałbym usunąć klucze mieszania, których odpowiadająca wartość mieszania jest pusta. To znaczy, jeśli mam następujące hashJak usunąć klucze mieszania, których wartość mieszania jest pusta?

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

następnie uzyskany mieszania powinny być (uwaga: 0 i true nie są uważane za puste)

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

Jak mogę sprawić, że?

+0

Czy chcesz zachować ': g => []' i 'h => {}'? –

Odpowiedz

22

Jeśli wykorzystaniem Rails można spróbować

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

lub w przypadku tylko Ruby

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

'value.to_s.strip.empty?' Czyta nieco lepiej niż '== ''', IMO. Ponadto, nie potrzebujesz Railsów, aby mieć 'puste?', Tylko ActiveSupport. –

+0

co, jeśli wartość jest mieszania, który jest pusty? lub dalszy zagnieżdżony hash jest pusty? –

1

Istnieje wiele sposobów, aby to osiągnąć wspólne zadanie

odrzucenia

To jest ten, którego używam najczęściej do czyszczenia skrótów, ponieważ jest krótki, czysty i wystarczająco elastyczny do obsługi dowolnych warunkowych i nie zmutowuje oryginalnego obiektu. Oto good article na temat korzyści wynikających z niezmienności w Ruby.

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

Uwaga: podkreślenia w powyższym przykładzie jest używany do wskazania, że ​​chcemy rozpakować krotka przekazany do proc, ale nie używamy pierwszą wartość (klawisz).

odrzucić!

Jednak jeśli chcesz mutować oryginalnego obiektu:

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

wybrać

odwrotnie, należy użyć select, która zwróci tylko te wartości, które zwracają prawdę, gdy oceniano

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

Wybierz!

... i mutowania wersja

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

kompaktowy

Wreszcie, kiedy tylko trzeba usunąć klucze, które mają nil wartości ...

hash.compact 

kompaktowy!

Wybrałeś już wzór, ale jest to wersja, która modyfikuje oryginalny skrót!

hash.compact! 
0

Jeśli chodzi o rozwiązanie technicy, zwróć uwagę na następujące wartości, gdy wartość == [].

[].blank?    => true 
[].to_s.strip == ''  => false 
[].to_s.strip.empty? => false 
Powiązane problemy