gpt4 book ai didi

filter - Clojure线程优先,带有过滤功能

转载 作者:行者123 更新时间:2023-12-02 06:58:23 26 4
gpt4 key购买 nike

我在将一些表单串在一起以对 korma 函数的结果集执行一些 ETL 时遇到问题。

我从 korma sql 回来:

({:id 1 :some_field "asd":children [{:a 1 :b 2 :c 3} {:a 1 :b 3 :c 4} {:a 2 :b 2 :c 3}] :another_field "qwe"})

我希望通过获取 :a 关键字为 1 的“子项”来过滤此结果集。

我的尝试:

;mock of korma result
(def data '({:id 1 :some_field "asd" :children [{:a 1 :b 2 :c 3} {:a 1 :b 3 :c 4} {:a 2 :b 2 :c 3}] :another_field "qwe"}))

(-> data
first
:children
(filter #(= (% :a) 1)))

我在这里期待的是一个 HashMap 向量:a 设置为 1,即:

[{:a 1 :b 2 :c 3} {:a 1 :b 3 :c 4}]

但是,我收到以下错误:

IllegalArgumentException Don't know how to create ISeq from: xxx.core$eval3145$fn__3146  clojure.lang.RT.seqFrom (RT.java:505)

从错误中我收集到它正在尝试从函数创建序列......尽管无法将原因联系起来。

此外,如果我通过执行以下操作完全分离过滤器功能:

(let [children (-> data first :children)] 
(filter #(= (% :a) 1) children))

它有效。我不确定为什么第一个线程没有应用过滤器函数,而是传入 :children 向量作为 coll 参数。

非常感谢任何和所有帮助。

谢谢

最佳答案

您需要thread-last宏:

(->> data first :children (filter #(= (% :a) 1)))

产量

({:a 1, :b 2, :c 3} {:a 1, :b 3, :c 4})

原始代码中的thread-first宏相当于编写:

(filter (:children (first data)) #(= (% :a) 1))

这会导致错误,因为您的匿名函数不是序列。

关于filter - Clojure线程优先,带有过滤功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30495847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com