Konvertieren verschachtelter Hash-Schlüssel von CamelCase nach snake_case in Ruby

Ich versuche zu bauen, ein API-wrapper gem, und Probleme mit der Konvertierung von hash-Schlüssel zu mehr Rubyish format aus der JSON-API zurückgibt.

JSON enthält mehrere Ebenen der Verschachtelung, die beiden Hashes und Arrays. Was ich will zu tun ist, um rekursiv konvertieren alle Tasten snake_case für eine einfachere Nutzung.

Hier ist, was ich habe, so weit:

def convert_hash_keys(value)
  return value if (not value.is_a?(Array) and not value.is_a?(Hash))
  result = value.inject({}) do |new, (key, value)|
    new[to_snake_case(key.to_s).to_sym] = convert_hash_keys(value)
    new
  end
  result
end

Den oben ruft diese Methode zum konvertieren von strings zu snake_case:

def to_snake_case(string)
  string.gsub(/::/, '/').
  gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
  gsub(/([a-z\d])([A-Z])/,'\1_\2').
  tr("-", "_").
  downcase
end

Ideal, das Ergebnis wäre ähnlich der folgenden:

hash = {:HashKey => {:NestedHashKey => [{:Key => "value"}]}}

convert_hash_keys(hash)
# => {:hash_key => {:nested_hash_key => [{:key => "value"}]}}

Ich bin immer die Rekursion falsch, und jeder version von diese Art von Lösung, die ich versucht habe, entweder nicht konvertieren Symbole über der ersten Ebene, oder geht über Bord und versucht, Sie zu konvertieren die gesamte hash-Werte, einschließlich der Werte.

Versuchen zu lösen, alle diese in eine helper-Klasse, sondern als änderung der tatsächlichen Hash und String-Funktionen, wenn möglich.

Vielen Dank im Voraus.

InformationsquelleAutor der Frage Andrew Stewart | 2012-01-03

Schreibe einen Kommentar