2016-06-10 10 views
1

Der Hash, mit dem ich arbeite, hat einen Hash für seine Werte, der immer eine ID, einen Namen und eine Beschreibung enthält. Ich bin nicht daran interessiert, die ID oder den Namen zu behalten und möchte nur jeden Hash-Wert durch seine entsprechende Beschreibung ersetzen.Ruby - Ersetze Hash-Werte elegant durch verschachtelten Wert (Beschreibung)

-Code

hsh['nested']['entries']['addr'] = hsh['nested']['entries']['addr']['description'] 
hsh['nested']['entries']['port'] = hsh['nested']['entries']['port']['description'] 
hsh['nested']['entries']['protocol'] = hsh['nested']['entries']['protocol']['description'] 
hsh['nested']['entries']['type'] = hsh['nested']['entries']['type']['description'] 
... (many more) 

Dies funktioniert gut, aber es ist nicht sehr elegant - in Wirklichkeit, ich habe 20 Einträge/Codezeilen die Arbeit zu erledigen.

Struktur des Hashwertes (für hsh['nested']['entries']['addr'])

{ "id" => "27", "name" => "Instance", "description" => "**This is what I need.**" } 

die erste Zeile des angezeigten Code als eine Probe nehmen, würde das Ergebnis sein, der Wert von hsh['nested']['entries']['addr']**This is what I need.**

wird, was ist Ein eleganter Weg dies zu erreichen?

+0

Bitte passen Sie Ihre Beispielcode und Daten, so dass es runnable ist und es zeigt, das Problem Sie haben. "[mcve]" beschreibt, wie man fragt. Wir benötigen den minimalen Code, der das Problem demonstriert, zusammen mit den minimalen Eingabedaten und Ihrer erwarteten Ausgabe. Während wir Daten zusammenbasteln können, zwingt dies uns dazu, verschiedene Ausgangspunkte zu verwenden, was zu Ungenauigkeiten und dem Potenzial verwirrender Antworten führt. Denken Sie daran, dass Ihre Frage und unsere Antworten ein Artikel sind, der zukünftigen Nutzern helfen soll, eine ähnliche Lösung zu finden, und diese nicht nur für Sie zu beantworten. –

+0

Entschuldigung, ich werde dies am Montag überprüfen und korrigieren, wenn möglich. Vielen Dank. –

Antwort

1
sub_hash = hsh['nested']['entries'] 
categories = %w{addr port protocol type} 

categories.each do |category| 
    sub_hash[category] = sub_hash[category]['description'] 
end 
+0

Danke, ich werde am Montag testen und melden. –

2
hsh = { 'nested'=> 
     { 'entries'=> 
      { 
      'addr'=>{ "id" => "1", "description"=>"addr" }, 
      'port'=>{ "id" => "2", "description"=>"port" }, 
      'cats'=>{ "id" => "3", "description"=>"dogs" }, 
      'type'=>{ "id" => "4", "description"=>"type" } 
      } 
     } 
     } 

keys_to_replace = ["addr", "port", "type"] 

hsh['nested']['entries'].tap { |h| keys_to_replace.each { |k| h[k]=h[k]["description"] } 
    #=> { "addr"=>"addr", 
    #  "port"=>"port", 
    #  "cats"=>{"id"=>"3", "description"=>"dogs"}, 
    #  "type"=>"type" 
    # } 

hsh 
    #=> {"nested"=> 
    #  { "entries"=> 
    #  { "addr"=>"addr", 
    #   "port"=>"port", 
    #   "cats"=>{"id"=>"3", "description"=>"dogs"}, 
    #   "type"=>"type" 
    #  } 
    #  } 
    # } 
+0

Niemals 'tap' vorher benutzt, werde ich mir ansehen, wie das bald funktioniert und welche Antwort am robustesten ist. Bin dankbar. –

+0

Sie werden feststellen, dass sie gleichermaßen robust sind. Der Hauptunterschied besteht darin, dass 'tap' die modifizierte' hsh' zurückgibt, während @sephs Antwort dies nicht tut. Wenn es in eine Methode eingebettet ist, müsste Seph 'hsh' als letzte Zeile hinzufügen. Dieser Unterschied ist gering. Es kommt auf die persönliche Präferenz an, vielleicht welche Methode am besten "liest". –

+0

Ich gebe das nur @seph, weil ich dem Außenseiter einige Punkte gegeben habe. Klar, du brauchst nicht mehr :). Trotzdem ist dies eine sehr hilfreiche Erklärung und ich verstehe den Unterschied. Ich werde wahrscheinlich Ihren Code in der Zukunft verwenden, wenn ich den identischen, geänderten Hash zurückgeben muss. In diesem Fall muss ich mich nicht darum kümmern, den Hash neu aufzubauen. Um es klar zu sagen, wenn ich die Antwort von seph innerhalb einer Methode verwende, muss ich den Hash zurückgeben - verstanden. –

Verwandte Themen