繁体   English   中英

clojure过滤器按键映射

[英]clojure filter map by keys

我正在关注此示例: http//groups.google.com/group/clojure/browse_thread/thread/99b3d792b1d34b56

(见最后的回复)

这是我得到的神秘错误:

Clojure 1.2.1
user=> (def m {:a "x" :b "y" :c "z" :d "w"})
#'user/m
user=> (filter #(some % [:a :b]) m)
java.lang.IllegalArgumentException: Key must be integer
(user=>

我也不明白为什么这会起作用。 是不是(某些......)每次都会返回第一个匹配值“x”? 我是一个完全没人参加clojure并且只是想学习。

请赐教。

我想我只需要阅读更多的文档:

(select-keys m [:a :b])

虽然我仍然不确定我发现的例子意图是什么......

如果您在地图上“迭代”,您将获得键值对而不是键。 例如,

   user=> (map #(str %) {:a 1, :b 2, :c 3})
   ("[:a 1]" "[:b 2]" "[:c 3]")

因此,你的匿名函数试图评估(some [:a "x"] [:a :b]) ,这显然不起作用。

理想的解决方案是使用另一个答案中提到的select-keys

(filter 
  (fn [x] 
    (some #{(key x)} [:a :b])) m)

使用filtersome (但更丑陋和更慢)会做同样的事情。

如果某些[:a :b]在集合#{(key x)} (即使用set作为谓词),则通过mm过滤,然后返回映射条目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM