2016-08-31 8 views
0

Ich versuche, einen Clojure-Vektor mit Werten aus einer Karte zu füllen. Ich habe einen anderen Vektor von bestimmten Schlüsseln in der Karte speichern die Werte, die ich brauche. Ich muss den Schlüssel-Vec durchlaufen, die Werte aus der Karte abrufen und sie in einem anderen Vektor speichern.Füllen Sie einen Clojure-Vektor

Ich habe versucht mit Schleife + recur:

(let [keys-vec (:keys-vec item) 
     my-map (:my-map item)] 

    (loop [newV [] 
      i 0] 
     (if (< i (count keys-vec)) 
     (recur 
      (conj newV (get my-map (get keys-vec i))) 
      (inc i)) 

     newV))) 

Und es funktionierte. Aber ich weiß, dass Clojure für seinen minimalistischen/effizienten Code-Schreibstil bekannt ist und ich wollte wissen, ob es einen besseren Weg gibt.

Irgendwelche Ideen?

+1

Können Sie angeben, was Sie erreichen möchten? Wird '' def neues-vector existing-vector '' das Problem nicht lösen? – superkonduktr

+2

Ich glaube, es ist nah an einem Anti-Muster in Clojure, um durch einen Vektor mit 'loop'- und Element-Indizes zu iterieren, da Clojures Sammlungen unveränderlich und beständig sind. Stattdessen werden Sie aufgefordert, reduzierende Funktionen zu verwenden. Der idiomatische Weg, um die Aufgabe zu erfüllen, wäre einfach "(Vals (Select-Keys My-Map Keys-Vec))". – superkonduktr

+0

Sie haben recht, es hat funktioniert. Vielen Dank! –

Antwort

2

Sie möchten die Funktion select-keys nur die Schlüssel von Interesse aus Ihrer Karte extrahieren. Siehe: http://clojuredocs.org/clojure.core/select-keys

Verwenden Sie dann die vals Funktion alle Werte aus der gefilterten Karte zu extrahieren:

> (def my-map {:a 1 :b 2 :c 3}) 
> (def my-keys [:a :b]) 
> (select-keys my-map my-keys) 
{:a 1, :b 2} 

> (def filtered-map (select-keys my-map my-keys)) 
> filtered-map 
{:a 1, :b 2} 

> (vals filtered-map) 
(1 2) 

Sie sollten einen Browser-Tab offen für die Clojure Spickzettel zu allen Zeiten halten. Es ist von unschätzbarem Wert, um die gewünschten Funktionen zu finden. Studiere es immer wieder, denn du wirst immer wieder neue Dinge finden. Dies ist meine Lieblingsversion:

http://jafingerhut.github.io/cheatsheet/clojuredocs/cheatsheet-tiptip-cdocs-summary.html

+0

Es hat funktioniert! Vielen Dank –

3

Ich würde sagen, dass der idiomatische Weg ist, Original-Vektor zu verwenden. Ich sehe keinen Grund, eine unveränderbare Datenstruktur explizit zu klonen.

1

Mit Alan Thompson's example:

(def my-map {:a 1 :b 2 :c 3}) 
(def my-keys [:a :b]) 

... eine einfache und schnelle Lösung ist

(mapv my-map my-keys) 
;[1 2] 

Die Alternative

(vals (select-keys my-map my-keys)) 
;(2 1) 

... darf nicht (und in diesem Fall nicht) die von my-keys angegebene Reihenfolge einhalten.