Tengo un hash de tamaño aleatorio, que puede tener valores como "100"
, que me gustaría convertir a enteros. Sé que puedo hacerlo usando value.to_i if value.to_i.to_s == value
, pero no estoy seguro de cómo hacerlo de forma recursiva en mi hash, teniendo en cuenta que un valor puede ser una cadena o una matriz (de hashes o de cadenas) u otro hash.Convertir recursivamente todas las cadenas numéricas en enteros en un hash Ruby
Respuesta
Esta es una implementación recursiva bastante directa (aunque tener que manejar tanto arrays como hashes agrega un poco de trucos).
def fixnumify obj
if obj.respond_to? :to_i
# If we can cast it to a Fixnum, do it.
obj.to_i
elsif obj.is_a? Array
# If it's an Array, use Enumerable#map to recursively call this method
# on each item.
obj.map {|item| fixnumify item }
elsif obj.is_a? Hash
# If it's a Hash, recursively call this method on each value.
obj.merge(obj) {|k, val| fixnumify val }
else
# If for some reason we run into something else, just return
# it unmodified; alternatively you could throw an exception.
obj
end
end
Y, oye, incluso funciona:
hsh = { :a => '1',
:b => '2',
:c => { :d => '3',
:e => [ 4, '5', { :f => '6' } ]
},
:g => 7,
:h => [],
:i => {}
}
fixnumify hsh
# => {:a=>1, :b=>2, :c=>{:d=>3, :e=>[4, 5, {:f=>6}]}, :g=>7, :h=>[], :i=>{}}
Gracias, eso funciona. Sin embargo, tuve que cambiar el primero si to 'obj.respond_to? : to_i y obj.to_i.to_s == obj' porque mi hash también puede contener cadenas alfabéticas. Puede editar su respuesta en consecuencia. ¡Gracias de nuevo! –
'obj.merge (obj) {| k, val | fixnumify val} '=>' Hash [obj.map {| k, v | [k, fixnumify (val)] '? Solo tengo la corazonada de que puede ser más rápido. –
Eso podría ser, @VictorMoroz, aunque lo adivinaría solo de forma incremental. Siempre me olvido de 'Hash []'. ¡Gracias! –
Ésta es mi clase de ayuda. Solo convierte Cadenas que son solo números (Entero o Flotante).
module Helpers
class Number
class << self
def convert(object)
case object
when String
begin
numeric(object)
rescue StandardError
object
end
when Array
object.map { |i| convert i }
when Hash
object.merge(object) { |_k, v| convert v }
else
object
end
end # convert
private
def numeric(object)
Integer(object)
rescue
Float(object)
end # numeric
end # << self
end # Number
end # Helpers
Helpers::Number.convert [{a: ["1", "22sd"]}, 2, ['1.3', {b: "c"}]]
#=> [{:a=>[1, "22sd"]}, 2, [1.3, {:b=>"c"}]]
- 1. Convertir todas las cadenas en una lista a int
- 2. Cómo convertir cadenas en enteros en Python?
- 3. Convertir las teclas hash en minúsculas - Ruby Beginner
- 4. Ruby/Rails: Convertir un rango en un hash
- 5. PHP Obtenga todas las claves numéricas/anónimas en una matriz
- 6. ¿Convertir una matriz de enteros en una matriz de cadenas en Ruby?
- 7. ¿Cómo convertir números de cadenas a enteros en una lista?
- 8. Análisis flexible de cadenas numéricas en Python
- 9. Ayuda en relleno de cadenas numéricas
- 10. Convertir una secuencia de cadenas en enteros (Clojure)
- 11. Convertir cadenas binarias en listas de enteros usando Python
- 12. Clojure: ¿Convertir cadenas de claves hash en palabras clave?
- 13. PHP eliminar comas de cadenas numéricas
- 14. Mapeo de cadenas en enteros
- 15. ¿Cómo eliminar recursivamente todas las claves con valores vacíos de hash (YAML)?
- 16. Uso de enteros como claves hash
- 17. Buscar todas las cadenas codificadas en origen
- 18. recortar todas las cadenas en una matriz
- 19. Convirtiendo claves hash anidadas de CamelCase a snake_case en Ruby
- 20. ¿Por qué Ruby String.hash no es uniforme en todas las máquinas?
- 21. ¿Las cadenas se pueden mutar en Ruby?
- 22. Jackson JSON convierte enteros en cadenas
- 23. ¿Las cadenas en Ruby son mutables?
- 24. sumando números en un hash en ruby
- 25. Hash invert en Ruby?
- 26. Hash en Ruby
- 27. Cómo convertir cadenas numéricas racionales y decimales a flotantes en python?
- 28. ¿Cómo crear directorios recursivamente en ruby?
- 29. Java ExecutorService: awaitTerminación de todas las tareas creadas recursivamente
- 30. ¿Cómo creo un hash SHA1 en ruby?
Publicar un ejemplo –
Además, respuesta a su pregunta: el uso recursividad con '' #is_kind_of –
'obj.to_i.to_s == obj' parece extraño?. Puede haber diferentes representaciones de cadena para el mismo valor entero, p. Ej. "1_000_000" o "019". –