假设我们有这样一个数据结构:如何用Clojure
(def data
(atom [{:id 1 :first-name "John1" :last-name "Dow1" :age "14"}
{:id 2 :first-name "John2" :last-name "Dow2" :age "54"}
{:id 3 :first-name "John3" :last-name "Dow3" :age "34"}
{:id 4 :first-name "John4" :last-name "Dow4" :age "12"}
{:id 5 :first-name "John5" :last-name "Dow5" :age "24"}]))
我已经学会了如何通过一个键对其进行过滤,例如:
(defn my-filter
[str-input]
(filter #(re-find (->> (str str-input)
(lower-case)
(re-pattern))
(lower-case (:first-name %)))
@data))
> (my-filter "John1")
> ({:last-name "Dow1", :age "14", :first-name "John1", :id 1})
但是现在我对如何通过:first-name
,:last-name
和:age
过滤数据有点困惑吗?
更新:对不起,是足够的问题是什么的解释不太清楚......其实,我想所有的键:first-name
,:last-name
和:age
过滤器功能paticipate,因此,如果str-input
不匹配:first-name
的val,检查它是否与:last-name
的val等相匹配。
更新2: 试图some-fn
,every-pred
和transducers
后,我没有得到我所需要的,例如过滤器谓词中的正则表达式,我想现在是缺乏知识。 所以,我结束了这个功能正常,但代码是丑陋的和重复的。我如何摆脱代码重复?
(defn my-filter [str-input]
(let [firstname (filter #(re-find (->> (str str-input)
(upper-case)
(re-pattern))
(upper-case (:first-name %)))
@data)
lastname (filter #(re-find (->> (str str-input)
(upper-case)
(re-pattern))
(upper-case (:last-name %)))
@data)
age (filter #(re-find (->> (str str-input)
(upper-case)
(re-pattern))
(upper-case (:age %)))
@data)]
(if-not (empty? firstname)
firstname
(if-not (empty? lastname)
lastname
(if-not (empty? age)
age)))))
“every-pred”的“或”对应词是'some-fn'。你可以在第一个例子中切换它们,不需要使用'some'。 – madstap
没错。忘了它 – leetwinski
@leetwinski,你能否检查第二次更新?谢谢 – graaf