繁体   English   中英

在Clojure中过滤

[英]Filtering in Clojure

我有这样的地图

(def invoice 
{:productId ["001" "002" "003" "004" "005" "006" "007" "008" "009" "010"],
:price ["50" "60" "70" "50" "40" "45" "55" "90" "50" "70"],
:quantity ["0" "0" "1" "2" "0" "0" "0" "0" "0" "1"]})

我如何过滤所以它只显示数量为1或更多的产品ID?

我已经试过这样做了

(filter (> (invoice :quantity %) 1) (map list (invoice :price) (invoice :quantity) (invoice :productid))

但它不起作用

您需要创建一个函数作为第一个参数传递给filter 其次,在进行比较之前需要先解析数量,然后使用read-string

(filter #(> (read-string (second %)) 1) (map list (invoice :price) (invoice :quantity) (invoice :productId)))

第一步是构建一对产品ID和数量:

(map vector (invoice :quantity) (invoice :productId))
;; ["0" "001"] .... first element would be quantity and second is productiID

第二步将过滤掉哪个数量大于0,这里我使用(整数.xx)将数量转换为数字。

(filter #(> (Integer. (first %)) 0) (map vector (invoice :quantity) (invoice :productId)))

通常,当数据更“正常”时,数据更容易处理,因此您不必担心样本中的索引。 我建议将其存储为({:id x:price y:quant z} ...)的seq。

这个功能可以做到:

(defn invoices [invoice]
  (map (fn [id price quant]
          {:id id
           :price price
           :quant quant})  (:prouctId invoice)
                           (:price invoice)
                           (:quantity invoice))

然后从那里你可以简单地

(->> invoice 
     invoices 
     (remove #(= "0" (:price %))  ;; remove "0" prices
     (map :id))) ;; get ids

假设您的数据集没有负数量。

暂无
暂无

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

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