Clojure Specter:如何找到具有特定值的映射键?

5
在地图中,例如:
{"test-1" 23,
 "test-2" 456,
 "test-3" 23}

如何找到值为 23 的键?

你需要Specter用于那个输入吗?但它并不是深度嵌套的结构。 - Ertuğrul Çetin
2
这可能只是一个简单化的例子,虽然没有使用Specter也很容易实现,同样的情况也适用于许多普通数据结构与Specter的比较。然而,问题本身很明确,只是缺少一些来自OP的“我已经尝试过”的努力展示。 - cfrick
2个回答

7

我认为你不需要使用幽灵漏洞来做到这一点,只需要按值进行过滤即可。比如:

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

使用Specter的解决方案是:
(keys (specter/setval [specter/MAP-VALS #(not= 10 %)]
                       specter/NONE
                       {:key-1 10
                        :key-2 20
                        :key-3 10}))

1
你实际上也不需要 seq,因为 filter 会自动对其输入进行序列化。 - z7sg Ѫ

5

如果您想使用Specter查找某些内容,最好使用specter/select

(use 'com.rpl.specter)    

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

这正是我所期望和希望的解决方案!比其他方案更加优雅。 - sumek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接