J'ai une condition où, je reçois un hash
hash = {"_id"=>"4de7140772f8be03da000018", .....}
et je veux ce hachage comme
hash = {"id"=>"4de7140772f8be03da000018", ......}
PS : je ne sais pas quelles sont les clés dans le hachage, elles sont aléatoires qui viennent avec un préfixe "_" pour chaque clé et je ne veux pas de traits de soulignement
ruby-on-rails
ruby
ruby-on-rails-3
hash
Manish Das
la source
la source
_id
clés enid
dans un tableau de documents MongoDBRéponses:
la source
hash.delete :old_key
retourne et la suppression utilise l'ancienne clé. WOW, je veux qu'il soit tatoué quelque part :-D Mercirails Hash a une méthode standard pour cela:
http://api.rubyonrails.org/classes/Hash.html#method-i-transform_keys
UPD: méthode ruby 2.5
la source
Si toutes les clés sont des chaînes et qu'elles ont toutes le préfixe de soulignement, vous pouvez corriger le hachage en place avec ceci:
Le
k[1, k.length - 1]
bit saisit toutk
sauf le premier caractère. Si vous voulez une copie, alors:Ou
Vous pouvez également utiliser
sub
si vous n'aimez pas lak[]
notation pour extraire une sous-chaîne:Et, si seulement certaines des touches ont le préfixe de soulignement:
Des modifications similaires peuvent être apportées à toutes les autres variantes ci-dessus, mais ces deux:
devrait convenir aux clés qui n'ont pas de préfixes de soulignement sans modifications supplémentaires.
la source
tu peux faire
Cela devrait fonctionner pour votre cas!
la source
Si nous voulons renommer une clé spécifique dans le hachage, nous pouvons le faire comme suit:
Supposons que mon hachage est
my_hash = {'test' => 'ruby hash demo'}
Maintenant, je veux remplacer 'test' par 'message', alors:
my_hash['message'] = my_hash.delete('test')
la source
hash[:new_key] = has[:old_key]
:, c'est plutôthash[:dynamic_key] = hash[:_dynamic_key]
:, c'était une question claire sur regex et pas un simple remplacement de hachage.la source
la source
Je suis allé trop loin et j'ai proposé ce qui suit. Ma motivation derrière cela était d'ajouter des clés de hachage pour éviter les conflits de portée lors de la fusion / de l'aplatissement des hachages.
Exemples
Étendre la classe de hachage
Ajoute la méthode de rekey aux instances de hachage.
Exemple de pré-ajout
Exemple de coupe
Aplatir et ajouter une «portée»
Si vous renvoyez un hachage pour modifier la clé, il fusionnera le hachage, ce qui vous permet d'aplatir les collections. Cela nous permet d'ajouter de la portée à nos clés lors de l'aplatissement d'un hachage pour éviter d'écraser une clé lors de la fusion.
la source
Les réponses précédentes sont assez bonnes, mais elles peuvent mettre à jour les données d'origine. Si vous ne souhaitez pas que les données d'origine soient affectées, vous pouvez essayer mon code.
Il ignorera d'abord la clé '_id' puis fusionnera avec la clé mise à jour.
la source