ruby - objects - ¿Cómo elimino elementos en blanco de una matriz?
ruby select (16)
Tengo la siguiente matriz
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
Quiero eliminar elementos en blanco de la matriz y quiero el siguiente resultado:
cities = ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
¿Hay algún método como el compact
que lo haga sin bucles?
Más explícito
cities.delete_if(&:blank?)
Esto eliminará tanto los valores nil
valores de cadena vacía ( ""
).
Por ejemplo:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]
cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Actualizar con un estricto con join
y 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
Aquí hay un enfoque más para lograr esto.
Podemos usar la presence
con select
cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]
cities.select(&:presence)
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Aquí hay una solución si tiene tipos mixtos en su matriz:
[nil,"some string here","",4,3,2]
Solución:
[nil,"some string here","",4,3,2].compact.reject{|r| r.empty? if r.class == String}
Salida:
=> ["some string here", 4, 3, 2]
Cuando quiero ordenar una matriz como esta, uso:
["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
Esto eliminará todos los elementos en blanco o nulos.
En mi proyecto utilizo delete
:
cities.delete("")
Esto es lo que funciona para mí:
[1, "", 2, "hello", nil].reject(&:blank?)
salida:
[1, 2, "hello"]
Hay muchas formas de hacer esto, una es reject
noEmptyCities = cities.reject { |c| c.empty? }
También puedes usar reject!
, que modificará las cities
en su lugar. Devolverá las 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).
Prueba esto:
puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
Puedes probar esto
cities.reject!(&:empty?)
Utilice reject
:
>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Ya hay muchas respuestas, pero aquí hay otro enfoque si estás en el mundo de Rails:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
cities.select(&:present?)
más cities.select(&:present?)
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].delete_if {|c| c.empty? }
1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)
=> ["A", "B", "C"]
cities.reject! { |c| c.blank? }
¿La razón por la que quieres usar en blank?
sobre empty?
Es que el blanco reconoce nil, cadenas vacías y espacios en blanco. Por ejemplo:
cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }
todavía regresaría:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
¿Y llamando empty?
en " "
devolverá false
, lo que probablemente quieras que sea true
.
Nota: en blank?
solo es accesible a través de Rails, Ruby solo soporta empty?
.