rails - Ruby: ¿Cuál es el método más fácil para actualizar los valores de Hash?
ruby hash to json (5)
Decir:
h = { 1 => 10, 2 => 20, 5 => 70, 8 => 90, 4 => 34 }
Me gustaría cambiar cada valor v
a foo(v
), tal que h
será:
h = { 1 => foo(10), 2 => foo(20), 5 => foo(70), 8 => foo(90), 4 => foo(34) }
¿Cuál es la forma más elegante de lograr esto?
El siguiente es un poco más rápido que @Dan Cheail para hashes grandes, y tiene un estilo de programación un poco más funcional:
new_hash = Hash[old_hash.map {|key, value| key, foo(value)}]
Hash#map
crea una matriz de pares de valores clave, y Hash.[]
Convierte la matriz de pares en un hash.
Esto lo hara:
h.each {|k, v| h[k] = foo(v)}
Hay un par de maneras de hacerlo; la forma más directa sería usar Hash#each
para actualizar un nuevo hash:
new_hash = {}
old_hash.each do |key, value|
new_hash[key] = foo(value)
end
Puede usar la update
(alias de merge!
) Para actualizar cada valor usando un bloque:
hash.update(hash) { |key, value| value * 2 }
Tenga en cuenta que efectivamente estamos fusionando el hash
consigo mismo. Esto es necesario porque Ruby llamará al bloque para resolver la fusión de las claves que colisionan, estableciendo el valor con el valor de retorno del bloque.
Rails agregó transform_values()
, por lo que ahora puede hacer {a:1, b:2, c:3}.transform_values{|v| foo(v)}
{a:1, b:2, c:3}.transform_values{|v| foo(v)}
http://api.rubyonrails.org/classes/Hash.html#method-i-transform_values