Risposte:
Ci sono molti modi per farlo, uno è reject
noEmptyCities = cities.reject { |c| c.empty? }
È inoltre possibile utilizzare reject!
, che modificherà cities
sul posto. Restituirà cities
come valore di ritorno se rifiuta qualcosa o nil
se non viene fatto alcun rifiuto. Questo può essere un gotcha se non stai attento (grazie a ninja08 per averlo sottolineato nei commenti).
cities.reject!(&:blank?)
? empty?
è per array
blank?
è disponibile solo tramite ActiveSupport
. Lo standard Ruby usa String#empty?
: ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
reject
è meglio che reject!
perché [].reject!(&:empty?)
ritorna nil
, [].reject(&:empty?)
ritorna[]
Ecco cosa funziona per me:
[1, "", 2, "hello", nil].reject(&:blank?)
produzione:
[1, 2, "hello"]
:blank?
è specifico di Rails.
NoMethodError: undefined method empty? for nil:NilClass
, :blank?
è meglio di:empty?
:blank
funziona meglio di :empty
. Perché :empty
non funziona pernil
Nel mio progetto utilizzo delete
:
cities.delete("")
Quando voglio riordinare un array come questo, utilizzo:
["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
Ciò rimuoverà tutti gli elementi vuoti o nulli.
cities.delete_if(&:blank?)
Ciò rimuoverà sia i nil
valori che i valori stringa ( ""
) vuoti .
Per esempio:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]
cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Prova questo:
puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
Utilizzare reject
:
>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
reject(&:empty?)
.
nil.empty?
pausa booom!
reject(&:empty?)
con compact
es.[nil, ''].compact.reject(&:empty?)
cities.reject! { |c| c.blank? }
La ragione per cui si desidera utilizzare blank?
sopra empty?
è che vuoto riconosce pari a zero, stringhe vuote, e lo spazio bianco. Per esempio:
cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }
ritornerebbe ancora:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
E chiamando empty?
sul " "
tornerà false
, che probabilmente si vuole esseretrue
.
Nota: blank?
è accessibile solo tramite Rails, supporta solo Ruby empty?
.
Ci sono già molte risposte, ma ecco un altro approccio se sei nel mondo di Rails:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
present?
viene da ActiveSupport
. Questo non ha un tag Rails e richiedere una gemma in più per un metodo sembra eccessivo.
Ecco un altro approccio per raggiungere questo obiettivo
possiamo usare presence
conselect
cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]
cities.select(&:presence)
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
" "
elementi nel mio array che non sono stati rimossi con il metodo di rifiuto. Il tuo metodo rimosso nil
""
o " "
elementi.
Modo più breve cities.select(&:present?)
un altro metodo:
> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]
Aggiornamento con un rigoroso con join
&split
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.join(' ').split
Il risultato sarà:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Nota: questo non funziona con una città con spazi
cities.reject!(&:empty?)