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)