2012-04-02 6 views
1

ich habe eine unsortierte Anordnung von Tasten wie diese Verbindung:eine Reihe von Tasten auf einen Hash mit Schlüssel-Wert-Paaren wie Excel vlookup

keys = ["ccc", "ddd", "ggg", "aaa", "bbb"] 

und einer Hash-

hash = {"ddd" => 4, "aaa" => 1, "bbb" => 2, "eee" => 5, "fff" => 6} 

Ich würde Sie diese beiden Datenstrukturen zu verbinden, um eine Hash in der ursprünglichen Reihenfolge der Schlüssel zu den ersten Tasten zurückzukehren:

{"ccc" => nil, "ddd" => 4, "ggg" => nil, "aaa" => 1, "bbb" => 2} 

Positionen, die nicht in der Hash (lik e "ggg") sollte null zurückgeben. Dies ist analog zur Funktion "v-lookup" in Excel. das ist in Rubin. Vielen Dank!

+0

In Ihrem erwarteten Hash, warum ist "ccc" 3 und nicht gleich Null? Warum ist "DDD" 4 und nicht 3? –

+0

weil ich diese Frage ohne reichlich Koffein geschrieben habe. sollte jetzt korrigiert werden. – hagope

Antwort

4

Cryptic:

Hash[keys.zip(hash.values_at *keys)] 

Oder etwas länger, etwas weniger kryptisch:

keys.map.with_object({}) {|key, memo| memo[key] = hash[key]} 
+1

+1 für die funktionelle Lösung. Ich würde es nicht kryptisch nennen, es beschreibt genau, was es macht. – tokland

+0

Was passiert, wenn ich anstelle eines Hashs ein Hash-Array wie dieses habe: [{"ddd" => 4}, {"aaa"} => 1 ...] funktioniert diese Lösung noch? – hagope

+0

Warum hätten Sie eine so dumme Datenstruktur? Ordnen Sie es einfach dem Array 'keys' zu. – Reactormonk

Verwandte Themen