Ruby verfügt über eine Hilfsmethode für Hash, mit der Sie einen Hash so behandeln können, als wäre er invertiert (im Wesentlichen, indem Sie über Werte auf Schlüssel zugreifen können):
{a: 1, b: 2, c: 3}.key(1)
=> :a
Wenn Sie den invertierten Hash beibehalten möchten, sollte Hash # invert in den meisten Situationen funktionieren:
{a: 1, b: 2, c: 3}.invert
=> {1=>:a, 2=>:b, 3=>:c}
ABER...
Wenn Sie doppelte Werte haben, invert
werden alle bis auf das letzte Auftreten Ihrer Werte verworfen (da während der Iteration immer wieder neue Werte für diesen Schlüssel ersetzt werden). Ebenso key
wird nur das erste Spiel zurückgegeben:
{a: 1, b: 2, c: 2}.key(2)
=> :b
{a: 1, b: 2, c: 2}.invert
=> {1=>:a, 2=>:c}
Wenn Ihre Werte eindeutig sind, können Sie sie verwenden Hash#invert
. Wenn nicht, können Sie alle Werte wie folgt als Array beibehalten:
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
Hinweis: Dieser Code mit Tests ist jetzt auf GitHub .
Oder:
class Hash
def safe_invert
self.each_with_object({}){|(k,v),o|(o[v]||=[])<<k}
end
end
each_with_object
macht hier mehr Sinn alsinject
.each_with_object({}){ |i,o|k,v = *i; o[v] ||=[]; o[v] << k}
... schön wirdWetten, dass es einen gibt? In Ruby gibt es immer einen kürzeren Weg!
Es ist ziemlich einfach, benutze einfach
Hash#invert
:Et voilà!
quelle
Dies behandelt auch die doppelten Werte.
quelle
Hash#inverse
gibt Ihnen:während die eingebaute
invert
Methode nur kaputt ist:quelle
Array verwenden
Verwenden von Hash
quelle
Wenn Sie einen Hash haben, bei dem die Schlüssel eindeutig sind, können Sie Hash # invert verwenden :
Dies funktioniert jedoch nicht, wenn Sie nicht eindeutige Schlüssel haben, bei denen nur die zuletzt gesehenen Schlüssel aufbewahrt werden:
Wenn Sie einen Hash mit nicht eindeutigen Schlüsseln haben, können Sie Folgendes tun:
Wenn die Werte des Hashs bereits Arrays sind, können Sie Folgendes tun:
quelle