具有过滤功能的clojure first-thread

OnR*_*lve 4 clojure filter sqlkorma

我遇到一个问题,将一些表格串联在一起,从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 的"children"来过滤此结果集.

我的尝试:

;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)))
Run Code Online (Sandbox Code Playgroud)

我在这里期待的是一个哈希图矢量:a设置为1,即:

[{:a 1 :b 2 :c 3} {:a 1 :b 3 :c 4}]
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

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

从错误我收集它试图从函数创建序列...虽然只是无法连接点为什么.

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

(let [children (-> data first :children)] 
    (filter #(= (% :a) 1) children))
Run Code Online (Sandbox Code Playgroud)

有用.我不确定为什么第一个线程不应用过滤器函数,将:children向量作为coll参数传递.

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

谢谢

Die*_*sch 6

你想要thread-last宏:

(->> data first :children (filter #(= (% :a) 1)))
Run Code Online (Sandbox Code Playgroud)

产量

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

thread-first原始代码中的宏等同于编写:

(filter (:children (first data)) #(= (% :a) 1))
Run Code Online (Sandbox Code Playgroud)

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