Si tiene hash de hashes cómo eliminar los valores de la primera hash - Ruby
-
21-12-2019 - |
Pregunta
¿Cuál es la forma más sencilla de:
{"Wednesday"=>{"Horse"=>{"9.0"=>1, "10.0"=>1}},
"Thursday"=>{"Horse"=>{"9.0"=>1, "10.0"=>1}}}
¿A esto?
{"Wednesday"=>{"9.0"=>1, "10.0"=>1},
"Thursday"=>{"9.0"=>1, "10.0"=>1}}
He estado luchando en mi consola durante 2 horas ahora.
¡Agradecería alguna respuesta!
P.s.El caballo es una variable como: FrenchStalion, Belgianstalion, Lipicanec ...
Solución
Una solución de estilo funcional (sin modificar el hash original o usar variables adicionales: una solución que se ve elegante para mí)
hash.reduce({}) { |acc, (k, v)| acc.merge(Hash[k, *v.values]) }
# => {"Wednesday"=>{"9.0"=>1, "10.0"=>1}, "Thursday"=>{"9.0"=>1, "10.0"=>1}}
Otros consejos
¿Qué tal esto?
hash = {"Wednesday"=>{"Horse"=>{"9.0"=>1, "10.0"=>1}},
"Thursday"=>{"Horse"=>{"9.0"=>1, "10.0"=>1}}}
a ={}
hash.each do |k,v|
a[k]=v.values.first
end
hacer esto
a = {"Wednesday"=>{"Horse"=>{"9.0"=>1, "10.0"=>1}},
"Thursday"=>{"Horse"=>{"9.0"=>1, "10.0"=>1}}}
d = {}
a.each { |k,v| d[k] = v["Horse"] }
puts d
The Hash[]
El método es útil para construir los hashes:
hash = {
"Wednesday"=>{"Horse"=>{"9.0"=>1, "10.0"=>1}},
"Thursday"=>{"Horse"=>{"9.0"=>1, "10.0"=>1}}
}
x = "Horse"
Hash[
hash.collect do |k, v|
[ k, v[x] ]
end
]
# => {"Wednesday"=>{"9.0"=>1, "10.0"=>1}, "Thursday"=>{"9.0"=>1, "10.0"=>1}}
Yo haría
hash = {"Wednesday"=>{"Horse"=>{"9.0"=>1, "10.0"=>1}},
"Thursday"=>{"Horse"=>{"9.0"=>1, "10.0"=>1}}}
hash.each_with_object({}) { |(k,v),h| h[k] = v['Horse']}
# => {"Wednesday"=>{"9.0"=>1, "10.0"=>1}, "Thursday"=>{"9.0"=>1, "10.0"=>1}}
actualización
hash.each_with_object({}) { |(k,v),h| h[k] = v.shift.last}
# => {"Wednesday"=>{"9.0"=>1, "10.0"=>1}, "Thursday"=>{"9.0"=>1, "10.0"=>1}}
Una forma es usar la forma de >Hash # Merge que emplea un bloque para determinar los valores de las teclas que están presentes en ambos hashes que se fusionan:
h = { "Wednesday"=>{ "Horse"=>{ "9.0"=>1, "10.0"=>1 } },
"Thursday" =>{ "Horse"=>{ "9.0"=>1, "10.0"=>1 } } }
key = "Horse"
h.merge(h) { |*_,g| g[key] }
#=> { "Wednesday"=>{ "9.0"=>1, "10.0"=>1 },
# "Thursday" =>{ "9.0"=>1, "10.0"=>1 } }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow