2017-11-28 2 views
0

BeiHinzufügen Schlüssel zu einer Folge von Vektoren in einem Vektor und deren Umwandlung Hash-Karten

[["foo" "bar" 2] ["biz" "baf" 3]] 

wie bekomme ich

[{:a "foo" :b "bar" :num 2} {:a "biz" :b "baf" :num 3}]? 

In Wirklichkeit meines Vektor Hunderte von Vektoren aufweist, die brauchen haben Schlüssel hinzugefügt und in Hash-Maps konvertiert.

+3

etwas wie folgt aus: '(mapv (teilweise zipmap [: a: b: num]) [["foo" "bar" 2] ["biz" "baf" 3]]) ' – leetwinski

+0

Danke dafür ... den Trick! Ich hätte das als Antwort akzeptiert, aber es ist ein Kommentar, glaube ich nicht, dass ich es kann. – THX1137

Antwort

1

Was leetwinski sagte, oder:

(def input [["foo" "bar" 2]["biz" "baf" 3]]) 

(mapv (fn [[a b num]] 
     {:a a 
     :b b 
     :num num}) input) 

Wenn Sie eine Menge Daten konvertieren müssen, vielleicht mapv nicht die beste Option ist, weil es auf einmal den ganzen Vektor in Erinnerung behalten. Normal map, die eine Lazy Seq erstellt, oder ein Wandler könnte in diesem Fall besser sein.

+0

Großartig, danke ... der Gedächtnisaspekt ist definitiv gut zu beachten! – THX1137

+0

Für mich finde ich diese Variante besser als zipmap, weil sie Refactoring-freundlich und lesbar ist – leetwinski

+0

Ein kleines Detail: Dieser Weg ist auch leistungsfähiger als zipmap, aber wir reden über 22 vs 220 ns so nicht wahrscheinlich bemerkt werden. –

0

Eine allgemeine Lösung:

(defn vectors->maps 
"takes a vector of vectors containing values and a vector of keys 
    and returns a vector of maps such that each value at index n in the value 
    vector is paired with each key at index n in the keys vector 
    ex: (vectors->maps [["foo" "bar" 2] ["biz" "baf" 3]], [:a :b :num]) 
     => [{:a "foo", :b "bar", :num 2} {:a "biz", :b "baf", :num 3}]" 
    [vectors keys] 
(mapv (partial zipmap keys) vectors)) 

Übung für den Leser: eine Spezifikation für diese Funktion zu schreiben und Tests zu erzeugen, um sie alle Grenzfälle aufzustöbern

Verwandte Themen