sirve - ruby tutorial
¿Cómo puedo fusionar dos hashes sin sobrescribir las claves duplicadas en Ruby? (3)
Hay una manera en la biblioteca estándar de Ruby para combinar hashes sin sobreescribir valores existentes o reasignar el hash.
important_hash.merge!(defaults) { |key, important, default| important }
¿Existe una manera fácil o elegante de combinar dos hashes sin sobreescribir claves duplicadas?
Es decir, si la clave está presente en el hash original, no quiero cambiar su valor.
Si su problema es que el hash original y el segundo ambos pueden tener claves duplicadas y no desea sobrescribir en ninguna dirección, es posible que deba realizar una simple fusión manual con algún tipo de control de colisión y manejo:
hash2.each_key do |key|
if ( hash1.has_key?(key) )
hash1[ "hash2-originated-#{key}" ] = hash2[key]
else
hash1[key]=hash2[key]
end
end
Obviamente, esto es muy rudimentario y supone que hash1 no tiene ninguna clave llamada "hash2-origininated-whatever", es mejor que simplemente agregue un número a la clave para que se convierta en key1, key2 y así sucesivamente hasta que aparezca uno que no está ya en hash1. Además, no he hecho ningún rubí durante unos meses, por lo que probablemente no sea sintácticamente correcto, pero deberías poder obtener la esencia.
Alternativamente redefinir el valor de la clave como una matriz para que hash1 [key] devuelva el valor original de hash1 y el valor de hash2. Depende de lo que quieras que tu resultado sea realmente.
Si tiene dos defaults
hash, options
y defaults
, y desea fusionar los defaults
en options
sin sobreescribir las claves existentes, lo que realmente desea hacer es lo contrario: fusionar las options
en los defaults
:
options = defaults.merge(options)
O bien, si está utilizando Rails, puede hacer:
options.reverse_merge!(defaults)