这是我多次遇到的情况,但没有找到惯用的方法...

假设有人想使用自定义的self-pred函数来过滤序列。此self-pred函数为不需要的元素返回nil,并为所需元素返回有用的信息。希望保留这些所需元素的评估self-pred值。

我的一般解决方案是:

;; self-pred is a pred function which returns valuable info
;; in general, they are unique and can be used as key
(let [new-seq (filter self-pred aseq)]
   (zipmap (map self-pred new-seq) new-seq))

基本上,对所有需要的元素调用self-pred两次。我觉得好丑

想知道是否有更好的方法。非常感谢任何输入!

最佳答案

我使用这种代码段:

(keep #(some->> % self-pred (vector %)) data)

像这样:
user> (keep #(some->> % rseq (vector %)) [[1 2] [] [3 4]])
;;=> ([[1 2] (2 1)] [[3 4] (4 3)])

或者,如果您想要更详细的结果:
user> (keep #(some->> % rseq (hash-map :data % :result)) [[1 2] [] [3 4]])
;;=> ({:result (2 1), :data [1 2]} {:result (4 3), :data [3 4]})

关于clojure - 如何过滤序列并保留评估的pred值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47325664/

10-08 20:28