Saltar al contenido

¿Eliminar todos los elementos vacíos de un hash / YAML?

Solución:

¡Rails 4.1 agregó Hash # compact y Hash # compact! como una extensión principal de Ruby Hash clase. Puedes usarlos así:

hash = { a: true, b: false, c: nil }
hash.compact                        
# => { a: true, b: false }
hash                                
# => { a: true, b: false, c: nil }
hash.compact!                        
# => { a: true, b: false }
hash                                
# => { a: true, b: false }
{ c: nil }.compact                  
# => {}

Aviso: esta implementación no es recursiva. Como curiosidad, lo implementaron utilizando #select en lugar de #delete_if por motivos de rendimiento. Consulte aquí el punto de referencia.

En caso de que desee exportarlo a su aplicación Rails 3:

# config/initializers/rails4_backports.rb

class Hash
  # as implemented in Rails 4
  # File activesupport/lib/active_support/core_ext/hash/compact.rb, line 8
  def compact
    self.select { |_, value| !value.nil? }
  end
end

Utilice hsh.delete_if. En su caso específico, algo como: hsh.delete_if { |k, v| v.empty? }

Podrías agregar un método compacto a Hash como este

class Hash
  def compact
    delete_if { |k, v| v.nil? }
  end
end

o para una versión que admita la recursividad

class Hash
  def compact(opts={})
    inject({}) do |new_hash, (k,v)|
      if !v.nil?
        new_hash[k] = opts[:recurse] && v.class == Hash ? v.compact(opts) : v
      end
      new_hash
    end
  end
end
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *