2016-11-14 4 views
0

Ich habe eine Reihe von Strings unbekannter Länge (aber sagen wir mal bis zu 5). Ich habe auch einen leeren Hash h = {} und einen Wert.Wie fügt man Werte in dynamisch verschachtelten Hash ein?

Ich mag das Array und den Wert zu transformieren, wie diese Hash:

val = 1 
h = {} 
a = ['a', 'b', 'c', 'd'] 
# result I want: 
{ 
    'a' => { 
    'b' => { 
     'c' => { 
     'd' => 1 
     } 
    } 
    } 
} 

Wichtig ist, dass einige der Schlüssel bereits vorhanden sein könnten (vor in einer Schleife Iteration erstellt). So könnte ich habe:

val = 2 
h = {'a' => {'b' => {'c' => {'d' => 1}}}} 
a = ['a', 'b', 'c', 'e'] 
# result I want: 
{ 
    'a' => { 
    'b' => { 
     'c' => { 
     'd' => 1, 
     'e' => 2 
     } 
    } 
    } 
} 

Irgendwelche Ideen, wie das zu tun?

Antwort

3

Wieder einmal inject zur Rettung:

def dredge(hash, list, value = nil) 
    # Snip off the last element 
    *list, tail = list 

    # Iterate through the elements in the path... 
    final = list.inject(hash) do |h, k| 
    # ...and populate with a hash if necessary. 
    h[k] ||= { } 
    end 

    # Add on the final value 
    final[tail] = value 

    hash 
end 

Dies könnte ein wenig abhängig von verbessert werden, wie belastbar Sie es brauchen, wie der Länge Null-Listen auf die Dinge zu sein und so weiter.

Hier angewendet wird:

h = {} 
a = ['a', 'b', 'c', 'd'] 
dredge(h, a, 1) 
# => {"a"=>{"b"=>{"c"=>{"d"=>1}}}} 

h = {'a' => {'b' => {'c' => {'d' => 1}}}} 
a = ['a', 'b', 'c', 'e'] 

dredge(h, a, 2) 
# => {"a"=>{"b"=>{"c"=>{"d"=>1, "e"=>2}}}} 
+3

Ich war ungefähr das gleiche schreiben :-) Sie 'verwenden könnte * Liste, Schwanz = list' zu vermeiden' list' – Stefan

+0

Wahre mutiert, das ist wahrscheinlich eine bessere Idee . Lass mich das ändern. – tadman

Verwandte Themen