Odpowiedzi:
Jest na to wiele sposobów, jednym z nich jest reject
noEmptyCities = cities.reject { |c| c.empty? }
Możesz również użyć reject!, który zmodyfikuje citiesw miejscu. Zwróci albo citieswartość zwrotną, jeśli coś odrzuci, albo nilnie zostanie odrzucony. Może to być problem, jeśli nie jesteś ostrożny (dzięki ninja08 za wskazanie tego w komentarzach).
cities.reject!(&:blank?)? empty?jest na tablice
blank?jest dostępne tylko za pośrednictwem ActiveSupport. Standardowy Ruby używa String#empty?: ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
rejectjest lepszy niż reject!dlatego , że [].reject!(&:empty?)wraca nil, [].reject(&:empty?)wraca[]
Oto, co działa dla mnie:
[1, "", 2, "hello", nil].reject(&:blank?)
wynik:
[1, 2, "hello"]
:blank?jest specyficzny dla Railsów.
NoMethodError: undefined method empty? for nil:NilClass, :blank? jest lepsze niż:empty?
:blankdziała lepiej niż :empty. Ponieważ :emptynie działa dlanil
Kiedy chcę uporządkować tablicę taką jak ta, używam:
["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
Spowoduje to usunięcie wszystkich pustych lub zerowych elementów.
cities.delete_if(&:blank?)
Spowoduje to usunięcie zarówno nilwartości, jak i pustych wartości string ( "").
Na przykład:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]
cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Spróbuj tego:
puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
Użyj reject:
>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
reject(&:empty?).
nil.empty?przerwa w grze!
reject(&:empty?)z compactnp[nil, ''].compact.reject(&:empty?)
cities.reject! { |c| c.blank? }
Powodem chcesz używać blank?na empty?to, że puste rozpoznaje zerowa, pustych strun i białą przestrzeń. Na przykład:
cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }
nadal wróciłby:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
I powołanie empty?na " "zwrot ten false, który prawdopodobnie ma być true.
Uwaga: blank?jest dostępny tylko przez Railsy, Ruby obsługuje tylko empty?.
Jest już wiele odpowiedzi, ale oto inne podejście, jeśli jesteś w świecie Railsów:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
present?pochodzi z ActiveSupport. Nie ma tagu Rails, a wymaganie dodatkowego klejnotu dla jednej metody wydaje się nadmierne.
Oto jeszcze jedno podejście do osiągnięcia tego celu
możemy używać presencezselect
cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]
cities.select(&:presence)
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
" "elementów w mojej tablicy, które nie zostały usunięte za pomocą metody odrzucania. Twoja metoda została usunięta nil ""lub " "przedmioty.
Najkrótsza droga cities.select(&:present?)
inna metoda:
> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]
Aktualizacja z surowa join&split
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.join(' ').split
Wynik będzie:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Zauważ, że: to nie działa z miastem ze spacjami
cities.reject!(&:empty?)