219 votes

Comment remplacer une clé de hachage par une autre clé

J'ai une condition où, je reçois un hash

   hash = {"_id"=>"4de7140772f8be03da000018", .....}
 

et je veux que ce hash

   hash = {"id"=>"4de7140772f8be03da000018", ......}
 

PS : Je ne sais pas quelles sont les clés dans le hachage, elles sont aléatoires et viennent avec un préfixe "_" pour chaque clé et je ne veux pas de caractères de soulignement.

765voto

gayavat Points 3169
hash[:new_key] = hash.delete :old_key

39voto

mu is too short Points 205090

Si toutes les clés sont des chaînes de caractères et tous ont le trait de soulignement préfixe, alors vous pouvez patcher le hachage en place avec ceci:

h.keys.each { |k| h[k[1, k.length - 1]] = h[k]; h.delete(k) }

L' k[1, k.length - 1] peu de s'approprier la totalité des k à l'exception du premier caractère. Si vous voulez une copie, puis:

new_h = Hash[h.map { |k, v| [k[1, k.length - 1], v] }]

Ou

new_h = h.inject({ }) { |x, (k,v)| x[k[1, k.length - 1]] = v; x }

Vous pouvez également utiliser sub si vous n'aimez pas l' k[] notation pour l'extraction d'une sous-chaîne:

h.keys.each { |k| h[k.sub(/\A_/, '')] = h[k]; h.delete(k) }
Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }

Et, si seulement quelques-unes des clés ont le trait de soulignement préfixe:

h.keys.each do |k|
    if(k[0,1] == '_')
        h[k[1, k.length - 1]] = h[k]
        h.delete(k)
    end
end

Des modifications similaires qui peut être fait pour toutes les autres variantes ci-dessus, mais ces deux:

Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }

devrait être d'accord avec les touches qui n'ont pas de souligner les préfixes sans des modifications supplémentaires.

14voto

Sadiksha Gautam Points 1610

tu peux faire

 hash.inject({}){|option, (k,v) | option["id"] = v if k == "_id"; option}
 

Cela devrait fonctionner pour votre cas!

14voto

Si nous voulons renommer une clé spécifique dans hash, nous pouvons le faire comme suit:
Supposons que mon hash soit my_hash = {'test' => 'ruby hash demo'}
Maintenant, je veux remplacer "test" par "message", puis:
my_hash['message'] = my_hash.delete('test')

10voto

DigitalRoss Points 80400
h.inject({}) { |m, (k,v)| m[k.sub(/^_/,'')] = v; m }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X