Jak powinienem zająć się usunięciem wszystkich pustych elementów (pustych elementów listy) z zagnieżdżonego pliku Hash lub YAML?
ruby-on-rails
ruby
hash
yaml
Brian Jordan
źródło
źródło
Hash#delete_if
jest to operacja destrukcyjna, podczas gdycompact
metody nie modyfikują obiektu. Możesz użyćHash#reject
. Lub wywołaj metodęHash#compact!
.compact
icompact!
są standardowo w Ruby => 2.4.0 i Rails => 4.1. Są jednak nierekurencyjne.HashWithIndifferentAccess
... Sprawdź moją wersję na stackoverflow.com/a/53958201/1519240Rails 4.1 dodał Hash # compact i Hash # compact! jako podstawowe rozszerzenie
Hash
klasy Rubiego . Możesz ich używać w ten sposób:Uwaga: ta implementacja nie jest rekurencyjna. Jako ciekawostka, zaimplementowali to używając
#select
zamiast ze#delete_if
względów wydajnościowych. Zobacz tutaj test porównawczy .Jeśli chcesz przenieść go do aplikacji Rails 3:
źródło
Użyj hsh.delete_if . W twoim konkretnym przypadku coś takiego:
hsh.delete_if { |k, v| v.empty? }
źródło
proc = Proc.new { |k, v| v.kind_of?(Hash) ? (v.delete_if(&l); nil) : v.empty? }; hsh.delete_if(&proc)
NoMethodError
jeśliv
jest zero.Jeśli używasz Ruby 2.4+, możesz dzwonić
compact
icompact!
https://ruby-doc.org/core-2.4.0/Hash.html#method-i-compact-21
źródło
Ten również usuwałby puste skróty:
źródło
swoop = Proc.new { |k, v| v.delete_if(&swoop) if v.kind_of?(Hash); v.blank? }
Możesz użyć skrótu # odrzucenia, aby usunąć puste pary klucz / wartość z rubinowego skrótu.
źródło
.empty?
wyrzuca błąd numerów, dzięki czemu można używać.blank?
wRails
działa zarówno dla skrótów, jak i tablic
PS w oparciu o czyjąś odpowiedź, nie mogę znaleźć
stosowanie -
Helpers::RecursiveCompact.recursive_compact(something)
źródło
Wiem, że ten wątek jest trochę stary, ale wymyśliłem lepsze rozwiązanie, które obsługuje wielowymiarowe skróty. Używa delete_if? poza tym, że jest wielowymiarowy i domyślnie czyści wszystko z pustą wartością, a jeśli przekazywany jest blok, jest przekazywany przez jego dzieci.
źródło
Zrobiłem w tym celu metodę deep_compact, która rekurencyjnie odfiltrowuje rekordy zerowe (i opcjonalnie również puste rekordy):
źródło
Ruby
Hash#compact
,Hash#compact!
aHash#delete_if!
nie działają na zagnieżdżonenil
,empty?
i / lubblank?
wartości. Należy zauważyć, że te dwa ostatnie sposoby są niszczące, i to wszystkonil
,""
,false
,[]
i{}
wartości liczone są jakoblank?
.Hash#compact
iHash#compact!
są dostępne tylko w Railsach lub Ruby w wersji 2.4.0 i nowszych.Oto nieniszczące rozwiązanie, które usuwa wszystkie puste tablice, skróty, ciągi i
nil
wartości, zachowując wszystkiefalse
wartości:(
blank?
można wymienić nanil?
lubempty?
w razie potrzeby).Destrukcyjna wersja:
Lub, jeśli chcesz dodać obie wersje jako metody instancji w
Hash
klasie:Inne opcje:
v.blank? && v != false
zev.nil? || v == ""
ściśle usuwanie pustych strun inil
wartościv.blank? && v != false
zev.nil?
ściśle usunąćnil
wartościZMIENIONO 2017/03/15, aby zachować
false
wartości i przedstawić inne opcjeźródło
nasza wersja: czyści również puste łańcuchy i wartości zerowe
źródło
W Simple one liner do usuwania wartości null w Hash,
źródło
blank?
idzie też na puste strunyMożna to zrobić za pomocą biblioteki aspektów (brakujące funkcje ze standardowej biblioteki), na przykład:
Działa z każdym Enumerable (w tym Array, Hash).
Zobacz, jak zaimplementowano metodę rekurencyjną .
źródło
Uważam, że najlepiej byłoby użyć metody autorekurencyjnej. W ten sposób dociera tak głęboko, jak potrzeba. Spowoduje to usunięcie pary klucz-wartość, jeśli wartość wynosi zero lub pusty hash.
Wtedy użycie tego będzie wyglądało tak:
Aby zachować puste skróty, możesz to uprościć do.
źródło
źródło
Spróbuj tego, aby usunąć zero
źródło
hash.compact!
Rekurencyjna wersja https://stackoverflow.com/a/14773555/1519240 działa, ale nie działa z
HashWithIndifferentAccess
innymi klasami, które są rodzajem skrótu.Oto wersja, której używam:
kind_of?(Hash)
zaakceptuje więcej klas, które są jak Hash.Możesz również zamienić
inject({})
na,inject(HashWithIndifferentAccess.new)
jeśli chcesz uzyskać dostęp do nowego skrótu za pomocą symbolu i ciągu.źródło
Oto coś, co mam:
źródło
Głębokie usunięcie wartości zerowych z skrótu.
źródło
Jeśli używasz
Rails
(lub samodzielnegoActiveSupport
), zaczynając od wersji6.1
, istniejecompact_blank
metoda, która usuwablank
wartości z hashów.Używa
Object#blank?
pod maską do określenia, czy przedmiot jest pusty.Tutaj jest link do dokumentów i link do odpowiedniego PR .
Dostępny jest również wariant destrukcyjny. Zobacz
Hash#compact_blank!
.Jeśli chcesz usunąć tylko
nil
wartości,proszę, rozważ użycie wbudowanego języka Ruby
Hash#compact
iHash#compact!
metod.źródło