tamaño objects len item for array ruby arrays

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? .