Ruby a une méthode d'assistance pour Hash qui vous permet de traiter un Hash comme s'il était inversé (en substance, en vous permettant d'accéder aux clés via des valeurs):
{a: 1, b: 2, c: 3}.key(1)
=> :a
Si vous souhaitez conserver le hachage inversé, Hash # invert devrait fonctionner dans la plupart des situations:
{a: 1, b: 2, c: 3}.invert
=> {1=>:a, 2=>:b, 3=>:c}
MAIS...
Si vous avez des valeurs en double, invert
supprimera toutes les occurrences de vos valeurs sauf la dernière (car elle continuera à remplacer la nouvelle valeur pour cette clé pendant l'itération). De même, key
ne renverra que la première correspondance:
{a: 1, b: 2, c: 2}.key(2)
=> :b
{a: 1, b: 2, c: 2}.invert
=> {1=>:a, 2=>:c}
Donc, si vos valeurs sont uniques, vous pouvez utiliser Hash#invert
. Sinon, vous pouvez conserver toutes les valeurs sous forme de tableau, comme ceci:
class Hash
# like invert but not lossy
# {"one"=>1,"two"=>2, "1"=>1, "2"=>2}.inverse => {1=>["one", "1"], 2=>["two", "2"]}
def safe_invert
each_with_object({}) do |(key,value),out|
out[value] ||= []
out[value] << key
end
end
end
Remarque: ce code avec des tests est maintenant sur GitHub .
Ou:
class Hash
def safe_invert
self.each_with_object({}){|(k,v),o|(o[v]||=[])<<k}
end
end
each_with_object
a plus de sens ici queinject
.each_with_object({}){ |i,o|k,v = *i; o[v] ||=[]; o[v] << k}
... sympaVous pariez qu'il y en a un! Il y a toujours un moyen plus court de faire les choses dans Ruby!
C'est assez simple, il suffit d'utiliser
Hash#invert
:Et voilà!
la source
Cela gérera également les valeurs en double.
la source
Hash#inverse
vous donne:alors que la
invert
méthode intégrée est juste cassée:la source
Utilisation de Array
Utiliser Hash
la source
Si vous avez un hachage où les clés sont uniques, vous pouvez utiliser Hash # invert :
Cela ne fonctionnera pas si vous avez des clés non uniques, cependant, où seules les dernières clés vues seront conservées:
Si vous avez un hachage avec des clés non uniques, vous pouvez faire:
Si les valeurs du hachage sont déjà des tableaux, vous pouvez faire:
la source