So symbolisieren Sie elegant_keys für einen 'verschachtelten' Hash
Betrachten Sie den folgenden Code:
hash1 = {"one" => 1, "two" => 2, "three" => 3}
hash2 = hash1.reduce({}){ |h, (k,v)| h.merge(k => hash1) }
hash3 = hash2.reduce({}){ |h, (k,v)| h.merge(k => hash2) }
hash4 = hash3.reduce({}){ |h, (k,v)| h.merge(k => hash3) }
hash4 ist ein 'verschachtelter' Hash, d. h. ein Hash mit String-Schlüsseln und ähnlich 'verschachtelten' Hash-Werten.
Mit der Methode 'symbolize_keys' für Hash in Rails können Sie die Zeichenfolgenschlüssel einfach in Symbole konvertieren. Aber ich suche eineelegant Möglichkeit, alle Schlüssel (Primärschlüssel plus Schlüssel aller Hashes in Hash4) in Symbole umzuwandeln.
Es geht darum, mich vor meinem (imo) hässliche Lösung:
class Hash
def symbolize_keys_and_hash_values
symbolize_keys.reduce({}) do |h, (k,v)|
new_val = v.is_a?(Hash) ? v.symbolize_keys_and_hash_values : v
h.merge({k => new_val})
end
end
end
hash4.symbolize_keys_and_hash_values #=> desired result
Zur Info: Setup ist Rails 3.2.17 und Ruby 2.1.1
Aktualisieren:
Antwort isthash4.deep_symbolize_keys
für Schienen <= 5.0
Antwort istJSON.parse(JSON[hash4], symbolize_names: true)
für Schienen> 5