【问题标题】:clojure: Removing maps from lazy-seq of mapsclojure:从地图的惰性序列中删除地图
【发布时间】:2015-08-03 15:12:57
【问题描述】:

我有一个lazy-seq 地图,我正试图根据另一个函数的返回值从该lazy-seq 中删除地图。另一个函数将返回 true 或 false,具体取决于 get 调用是否返回与参数相等的值。问题是该功能无法正常工作,我不太确定为什么。

    (defn filter-by-name "Filter by names" [name m]
       (if (= name (get m :name_of_person)) true false)) 
        ;To be called on each map

    (defn remove-nonmatching-values "Remove anything not matching" [filter-val all-maps]
      (map #(remove (filter-by-name filter-val %)) all-maps)) 
       ;trying to call on the lazy seq

【问题讨论】:

  • if是多余的,可以直接写(defn filter-by-name "Filter by names" [name m] (= name (get m :name_of_person)))
  • 刚刚注意到,谢谢。
  • 为了减少冗长,如果您发现有价值的贡献,表示感谢的方式是对答案或评论投赞成票,请查看tour 该网站旨在获取答案.这不是一个讨论论坛。没有闲聊。 :)
  • 我无法投票,否则我会这样做,只需要 2 个代表。

标签: clojure


【解决方案1】:

您只需要在地图序列上调用remove

 (defn remove-nonmatching-values 
    "Remove anything not matching" 
    [filter-val all-maps]
    (remove #(filter-by-name filter-val %) all-maps))

查看 Clojure 的 remove 文档

(删除 pred coll)

返回 coll 中项的惰性序列 (pred item) 返回 false。 pred 必须没有副作用。 当没有提供集合时返回一个转换器。

【讨论】:

  • 当我这样调用它时:(remove-nonmatching-values "hello" ({:name_of_peson "hello"} {:name_of_peson "bye"})) 它返回 ()。谢谢
  • 你没有传递一个正确的列表,而是调用一个你应该这样调用的函数:(remove-nonmatching-values "hello" '({:name_of_person "hello"} {:name_of_person "bye"}))
  • 这个函数在我看来是删除匹配的值,而不是不匹配的值。
  • @m0butt 您在示例中将:name_of_person 拼写为:name_of_peson
  • @Thumbnail 没有捕捉到这一点,无论它现在是否正常工作。谢谢
【解决方案2】:

为给定的name 生成所需的测试函数的函数是

(defn name-matcher [name]
  (fn [m] (= name (:name_of_person m))))

您所要做的就是相应地过滤地图:

(defn retain-matching-maps [name maps]
  (filter (name-matcher name) maps))

例如,

(retain-matching-maps "hello" (list {:name_of_person "hello"} {:name_of_person "bye"}))
;({:name_of_person "hello"})

我已经摆脱了

  • cmets(由函数名隐含)
  • if(由Guillermo 注明)
  • get(关键字 - 或映射 - 是隐含的 get 函数)
  • 函数名remove-nonmatching-values 中的双重否定。

您也可以使用:name 代替:name-of-person。程序表述得越简洁,出错的可能性就越小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    相关资源
    最近更新 更多