Ich möchte jeden value
in einem Hash durch ersetzen value.some_method
.
Zum Beispiel für einen einfachen Hash:
{"a" => "b", "c" => "d"}`
Jeder Wert sollte .upcase
d sein, also sieht es so aus:
{"a" => "B", "c" => "D"}
Ich habe es versucht #collect
und #map
bekomme immer nur Arrays zurück. Gibt es eine elegante Möglichkeit, dies zu tun?
AKTUALISIEREN
Verdammt, ich habe vergessen: Der Hash befindet sich in einer Instanzvariablen, die nicht geändert werden sollte. Ich benötige einen neuen Hash mit den geänderten Werten, möchte diese Variable jedoch nicht explizit definieren und dann den durchlaufenden Hash durchlaufen. Etwas wie:
new_hash = hash.magic{ ... }
Antworten:
oder, wenn Sie es lieber zerstörungsfrei machen und einen neuen Hash zurückgeben möchten, anstatt ihn zu ändern
my_hash
:Diese letzte Version hat den zusätzlichen Vorteil, dass Sie auch die Schlüssel transformieren können.
quelle
each_with_object
ist eine bequemere Version,inject
wenn Sie den Block nicht mit dem Hash beenden möchten:my_hash.each_with_object({}) {|(k, v), h| h[k] = v.upcase }
a_new_hash = Hash[ my_hash.map { |k, v| [k, v.upcase] } ]
.to_h
Da
ruby 2.4.0
Sie nativeHash#transform_values
Methode verwenden können:Es gibt auch eine destruktive
Hash#transform_values!
Version.quelle
Sie können die Werte sammeln und erneut von Array in Hash konvertieren.
So was:
quelle
Dies wird es tun:
Im Gegensatz zum
inject
Vorteil ist, dass Sie den Hash nicht erneut innerhalb des Blocks zurückgeben müssen.quelle
Versuchen Sie diese Funktion:
quelle
Dafür gibt es in ActiveSupport v4.2.0 eine Methode . Es wird aufgerufen
transform_values
und führt im Grunde nur einen Block für jedes Schlüssel-Wert-Paar aus.Da sie es mit einem machen
each
, gibt es meiner Meinung nach keinen besseren Weg, als sich durchzuschleifen.Aktualisieren:
Seit 2.4.0 Rubin können Sie nativ nutzen
#transform_values
und#transform_values!
.quelle
Möglicherweise möchten Sie noch einen Schritt weiter gehen und dies für einen verschachtelten Hash tun. Sicherlich passiert dies bei Rails-Projekten ziemlich oft.
Hier ist ein Code, um sicherzustellen, dass ein Parameter-Hash in UTF-8 enthalten ist:
quelle
Ich mache so etwas:
Dies bietet Ihnen die Möglichkeit, den Schlüssel oder Wert auch über einen beliebigen Ausdruck zu transformieren (und dies ist natürlich zerstörungsfrei).
quelle
Ruby hat die
tap
Methode ( 1.8.7 , 1.9.3 und 2.1.0 ), die für solche Dinge sehr nützlich ist.quelle
Schienen-spezifisch
Falls jemand muss nur anrufen
to_s
Methode der Werte für jeden und ist mit Rails nicht 4.2 (einschließlichtransform_values
Verfahren Link ), können Sie folgendes tun:Hinweis: Die Verwendung der 'json'-Bibliothek ist erforderlich.
Hinweis 2: Dadurch werden Schlüssel auch in Zeichenfolgen umgewandelt
quelle
Wenn Sie wissen, dass die Werte Zeichenfolgen sind, können Sie im Zyklus die Ersetzungsmethode für sie aufrufen : Auf diese Weise ändern Sie den Wert.
Obwohl dies auf den Fall beschränkt ist, in dem die Werte Zeichenfolgen sind und daher die Frage nicht vollständig beantworten, dachte ich, dass es für jemanden nützlich sein kann.
quelle
quelle