2012-09-20 5 views
6

Gibt es eine Möglichkeit, ein Schlüsselwertpaar zu destrukturieren? Ich habe eine Funktion, die eine Karte als Parameter nimmt, ich möchte den Wert des Schlüssels und den Wert in den Parametern selbst extrahieren. Wie mache ich das ?Wie man eine Karte als Schlüssel und Wert zerstört

Ich kann mit einem Vektor folgendes tun -

((fn [[ab]] (str ab)) [ab])

Wie mache ich das gleiche/ähnliche mit Karte -

((fn [{f}] (str kv)) {f})

Danke, 012.Murtaza

+0

Ich weiß nicht, worüber Ankur spricht, aber probiere das http://stackoverflow.com/questions/12505603/how-to-destructure-a-map-as-key-and-value/12505893#12505893 – runexec

Antwort

16

Karte Destrukturierung in Funktionen arg Listen zur Extraktion bestimmten Schlüssels aus einer Karte ausgebildet ist und ihnen Namen wie so geben:

core> (defn foo [{my-a :a my-b :b}] {my-a my-b}) 
core/foo                      
core> (foo {:a 1 :b 2}) 
{1 2} 

i empfehlen this tutorial. Es ist ein wenig schwierig, eine direkte Entsprechung zu ((fn[{k v}] (str k v)) {k v}) zu geben, weil die Karte viele Schlüssel und viele Werte haben könnte, so dass der Destrukturierungscode nicht in der Lage wäre zu sagen, welchen Schlüssel und welchen Wert Sie suchen. Die Strukturierung nach Schlüssel ist einfacher zu verstehen.

Wenn Sie möchten, willkürlich den ersten Eintrag in der Karte wählen Sie es extrahieren und die Liste Destrukturierung Form auf einer einzigen Karte Eintrag verwenden:

core> (defn foo [[k v]] {v k}) 
#'core/foo                      
core> (foo (first {1 2})) 
{2 1} 

in diesem Beispiel die Liste Destrukturierung Form [k v] verwendet wird, weil gibt zuerst den ersten Map-Eintrag als Vektor zurück.

+0

Es ist auch idiomatisch und praktisch, Kartenwerte automatisch Symbolen zuzuordnen, die Schlüsselnamen entsprechen. Das ist so geschrieben: '(defn foo [{: keys [a b]}] (str a b))'. Dann beim Funktionsaufruf: '(foo {: a 1: b 2})'. Dies wird "12" zurückgeben. –

+0

Das zweite Beispiel ist sehr nützlich bei der Verarbeitung aller Schlüssel/Wert-Paare in einer Karte, da die Seq-Ansicht einer Karte eine Liste von Schlüssel/Wert-Paaren ist. Z.B. (map (fn [[kv]] (println kv)) my-map) – Alex

-3
user=> (for [x (hash-map :a 1 :b 2 :c 3)] (str (first x) " " (second x))) 
(":a 1" ":c 3" ":b 2") 
+0

Die Frage ist 'de-structure a map' nicht über 'concat first 2 elements of a set' – Ankur

+0

Sein Beispiel funktioniert mit meinem Code. Kannst du mir zeigen, dass es nicht so ist? – runexec

+0

Der Beispielcode ist nur ein Beispiel für eine Map mit einem Schlüsselwertpaar, was ist mit der übergebenen Map, die fünf Schlüssel/Wert-Paare enthält? Wie behandelt Ihr Code das? Bsp .: map {: name "superman": Alter 1000: job "superhero"}, jetzt müssen wir alle drei Schlüssel und ihren Wert zerstören ... HINWEIS: Destrukturierung nicht manuell extrahieren – Ankur

2

Es gibt Verknüpfungen zum Destrukturieren von Karten. Wenn Sie beispielsweise nach bestimmten Schlüsseln suchen, müssen Sie nicht name1 eingeben: key1 name1: key2 ...

z.

main=> (defn fbb [{:keys [foo bar baz]}] (+ foo bar baz)) 
#'main/fbb 
main=> (fbb {:foo 2 :bar 3 :baz 4}) 
9 

statt ...

(defn fbb [{foo :foo bar :bar baz :baz}] (+ foo bar baz)) 

Wenn Ihre Karte Schlüssel-Strings sind, können Sie :strs sagen statt :keys und wenn sie Symbole sind, können Sie :syms verwenden.

Verwandte Themen