Respostas:
Existem muitas maneiras de fazer isso, uma é reject
noEmptyCities = cities.reject { |c| c.empty? }
Você também pode usar reject!
, que será modificado cities
no local. Ele retornará cities
como seu valor de retorno se rejeitar alguma coisa ou nil
se nenhuma rejeição for feita. Isso pode ser um problema, se você não tomar cuidado (obrigado a ninja08 por apontar isso nos comentários).
cities.reject!(&:blank?)
? empty?
é para matrizes
blank?
está disponível apenas através ActiveSupport
. Padrão Ruby faz uso String#empty?
: ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
reject
é melhor do que reject!
porque [].reject!(&:empty?)
retornos nil
, [].reject(&:empty?)
retornos[]
Aqui está o que funciona para mim:
[1, "", 2, "hello", nil].reject(&:blank?)
resultado:
[1, 2, "hello"]
:blank?
é específico do Rails.
NoMethodError: undefined method empty? for nil:NilClass
, :blank?
é melhor que:empty?
:blank
funciona melhor que :empty
. Porque :empty
não funciona paranil
Quando eu quero arrumar uma matriz como esta, eu uso:
["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
Isso removerá todos os elementos em branco ou nulos.
cities.delete_if(&:blank?)
Isso removerá os nil
valores e os valores vazios de string ( ""
).
Por exemplo:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]
cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Tente o seguinte:
puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
Use reject
:
>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
reject(&:empty?)
,.
nil.empty?
booom break!
reject(&:empty?)
com, compact
por exemplo,[nil, ''].compact.reject(&:empty?)
cities.reject! { |c| c.blank? }
O motivo pelo qual você deseja usar blank?
mais empty?
é que o espaço em branco reconhece nada, cadeias vazias e espaços em branco. Por exemplo:
cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }
ainda retornaria:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
E chamando empty?
no " "
retorno vontade false
, que você provavelmente vai querer ser true
.
Nota: blank?
só é acessível através do Rails, o Ruby suporta apenas empty?
.
Já existem muitas respostas, mas aqui está outra abordagem, se você estiver no mundo do Rails:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
present?
vem de ActiveSupport
. Isso tem uma tag no Rails, e exigir uma gema extra para um método parece excessivo.
Aqui está mais uma abordagem para alcançar esse objetivo.
nós podemos usar presence
comselect
cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]
cities.select(&:presence)
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
" "
elementos em minha matriz que não foram removidos com o método rejeitar. Seu método removido nil
""
ou " "
itens.
Você pode tentar isso
cities.reject!(&:empty?)
cities.reject!(&:blank?)
Maneira mais curta cities.select(&:present?)
outro método:
> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]
Atualize com um rigoroso com join
&split
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.join(' ').split
O resultado será:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Observe que: isso não funciona com uma cidade com espaços
cities.reject!(&:empty?)