Risposte:
Ci sono molti modi per farlo, uno è reject
noEmptyCities = cities.reject { |c| c.empty? }
È inoltre possibile utilizzare reject!, che modificherà citiessul posto. Restituirà citiescome valore di ritorno se rifiuta qualcosa o nilse 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?
:blankfunziona meglio di :empty. Perché :emptynon 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 nilvalori 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 compactes.[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 presenceconselect
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?)