Respuestas:
Hay muchas maneras de hacer esto, una es reject
noEmptyCities = cities.reject { |c| c.empty? }
También puede usar reject!, que se modificará citiesen su lugar. Volverá citiescomo su valor de retorno si rechazó algo, o nilsi 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
rejectes 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 railsmé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?
:blankfunciona mejor que :empty. Porque :emptyno 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 nilvalores 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, compactpor 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 ." "falsetrue
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 presenceconselect
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?)