dictionary - Clojure:如果键存在,则惯用更新 map 的值

标签 dictionary clojure key

这是我的问题:我想要一个函数 helpme获取 map 并替换键 :r:g当且仅当这些键存在时才使用空向量。例如:

输入:

(helpme {:a "1" :r ["1" "2" "3"] :g ["4" "5"]})

输出:
{:a "1" :r [] :g []}

输入:
(helpme {:a "1" :r ["1" "2" "3"]})

输出:
{:a "1" :r []}

我可以定义一个函数“helpme”来执行此操作,但它过于复杂,我觉得必须有一种更简单(更惯用)的方法......

这是我完成的过于复杂的方法,如下要求:
(defn c [new-doc k] (if (contains? new-doc k) (assoc new-doc k []) new-doc))
(defn helpme [new-doc] (c (c new-doc :r) :g))

最佳答案

(defn helpme [m]
  (into m (for [[k _] (select-keys m [:r :g])]
            [k []])))

简而言之,当项目数设置为[]时只需要在一处编辑变化。

关于dictionary - Clojure:如果键存在,则惯用更新 map 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20136617/

相关文章:

java - map 和 ImmutableMap 的区别

python - 在 Python 中使用 None 作为字典键是否合理?

clojure - 为什么 Clojure 区分符号和变量?

clojure - Clojure 中箭头宏和双箭头宏的区别

clojure - Clojure atom 中的长时间运行函数

wpf - 将 PreviewKeyDown 中收到的键转换为字符串

python - 遍历字典或其键并更改值是不好的做法吗?

c++ - 打印一个 map 的值,它有两个字符串作为键和 vector 作为值

javascript - 滥用 pouchDB 的文档 ID : Get first prefix element

mysql - 避免 JOIN 来提高性能?