Respuestas:
Hay muchas maneras de hacer esto, una es reject
noEmptyCities = cities.reject { |c| c.empty? }
También puede usar reject!
, que se modificará cities
en su lugar. Volverá cities
como su valor de retorno si rechazó algo, o nil
si no se hacen rechazos. Eso puede ser un problema si no tienes cuidado (gracias a ninja08 por señalar esto en los comentarios).
cities.reject!(&:blank?)
? empty?
es para matrices
blank?
solo está disponible a través de ActiveSupport
. Standard Ruby usa String#empty?
: ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
reject
es mejor que reject!
porque [].reject!(&:empty?)
regresa nil
, [].reject(&:empty?)
regresa[]
1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)
=> ["A", "B", "C"]
blank?
es una buena opción, pero es un rails
método, y esta pregunta se refiere a la llanuraruby
Esto es lo que funciona para mí:
[1, "", 2, "hello", nil].reject(&:blank?)
salida:
[1, 2, "hello"]
:blank?
es específico de Rails.
NoMethodError: undefined method empty? for nil:NilClass
, :blank?
es mejor que:empty?
:blank
funciona mejor que :empty
. Porque :empty
no funciona paranil
En mi proyecto uso delete
:
cities.delete("")
Cuando quiero ordenar una matriz como esta, uso:
["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
Esto eliminará todos los elementos en blanco o nulos.
cities.delete_if(&:blank?)
Esto eliminará los nil
valores y los valores de cadena ( ""
) vacíos .
Por ejemplo:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]
cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Prueba esto:
puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
Uso reject
:
>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
reject(&:empty?)
.
nil.empty?
ruptura de la pluma!
reject(&:empty?)
con, compact
por ejemplo,[nil, ''].compact.reject(&:empty?)
cities.reject! { |c| c.blank? }
La razón por la que desea utilizar blank?
más empty?
es que reconoce en blanco nula, cadenas vacías, y un espacio en blanco. Por ejemplo:
cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }
aún regresaría:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Y volverá empty?
a llamar , lo que probablemente quieras ser ." "
false
true
Nota: blank?
solo se puede acceder a través de Rails, Ruby solo es compatible empty?
.
Ya hay muchas respuestas, pero aquí hay otro enfoque si estás en el mundo de Rails:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
present?
proviene de ActiveSupport
. Esto tiene una etiqueta sin Rails y requiere una gema extra para un método parece excesivo.
Aquí hay un enfoque más para lograr esto
podemos usar presence
conselect
cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]
cities.select(&:presence)
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
" "
elementos en mi matriz que no se eliminaron con el método de rechazo. Su método eliminado nil
""
o " "
artículos.
Camino más corto cities.select(&:present?)
otro método:
> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]
Actualizar con un estricto con join
&split
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.join(' ').split
El resultado será:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Tenga en cuenta que: esto no funciona con una ciudad con espacios
cities.reject!(&:empty?)