2017-09-01 1 views
2

Par exemple, dans une carte:Clojure Spectre: comment trouver des clés de carte ayant une valeur spécifique?

{"test-1" 23, 
"test-2" 456, 
"test-3" 23} 

Comment trouver les clés qui ont une valeur 23?

+0

avez-vous besoin de spectre pour cette entrée? ce n'est pas profondément structuré tho. –

+2

Eh bien cela pourrait aussi bien être un exemple banalisé, et bien que facile à faire sans spectre, on pourrait en dire autant pour de nombreuses structures de données triviales vs spectre. Pourtant, la question elle-même est claire et ne manque que quelques "j'ai déjà essayé" affichage d'efford de OP. – cfrick

Répondre

2

Si vous voulez trouver quelque chose en utilisant Specter, il est préférable d'utiliser spectre/select.

(use 'com.rpl.specter)  

(select [ALL #(= (second %) 23) FIRST] 
    {"test-1" 23, 
    "test-2" 456, 
    "test-3" 23}) 
+0

C'est exactement le genre de solution que j'attendais et j'espère! Beaucoup plus élégant que les autres. – sumek

6

Je pense que vous n'avez pas besoin de spectre pour le faire, il suffit de filtrer par valeur. I.e.:

(->> {:key-1 10 
     :key-2 20 
     :key-3 10} 
     (filter (fn [[k v]] (= v 10))) 
     (map first)) 
==> [:key-1 :key-3] 

Une solution est Specter:

(keys (specter/setval [specter/MAP-VALS #(not= 10 %)] 
         specter/NONE 
         {:key-1 10 
         :key-2 20 
         :key-3 10})) 
+1

Vous n'avez pas vraiment besoin de 'seq' car le filtre va quand même segmenter son entrée. –

+0

oui, vous avez raison –