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

Antworten auf die Frage(6)

Ihre Antwort auf die Frage