clojure 更新向量内的 map 的方法

标签 clojure

更新向量内的映射的 clojure 方法是什么,例如如果我有这样的东西,假设每个 map 都有唯一的 :name

(def some-vec
  [{:name "foo"
    ....}
   {:name "bar"
    ....}
   {:name "baz"
    ....}])

如果 map 的 :name 等于 foo,我想以某种方式更新 map 。目前我正在使用 map,就像这样

(map (fn [{:keys [name] :as value}]
       (if-not (= name "foo")
         value
         (do-something .....))) some-vec)

但是即使我只更新一项,这也会循环整个向量。

最佳答案

将数据保存为 map ,而不是 map 记录向量,以:name为键。

(def some-data
  {"foo" {:name "foo" :other :stuff}
   "bar" {:name "bar" :other :stuff}
   "baz" {:name "baz" :other :stuff}})

然后

(assoc-in some-data ["bar" :other] :things)

产生

{"foo" {:other :stuff, :name "foo"},
 "bar" {:other :things, :name "bar"},
 "baz" {:other :stuff, :name "baz"}}

一口气。

您可以捕获基本操作

(defn assoc-by-fn [data keyfn datum]
  (assoc data (keyfn datum) datum))

例如,当

(assoc-by-fn some-data :name {:name "zip" :other :fassner})

产生

{"zip" {:other :fassner, :name "zip"},
 "foo" {:other :stuff, :name "foo"},
 "bar" {:other :stuff, :name "bar"},
 "baz" {:other :stuff, :name "baz"}}

关于clojure 更新向量内的 map 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25664334/

相关文章:

clojure - 动态莱宁根 :profiles

clojure - 正则表达式(Clojure)中字母数字值的快捷方式?

用于封装的 Clojure 对象和高阶函数

适用于protobuf的Clojure示例

java - 与 python psycopg2 相比,使用 clojure jdbc 将文件记录插入 postgres db 需要很长时间

clojure - 如何在Clojure中调用Java静态方法?

clojure - 序言问题的适用性

java - Clojure Android HTTP 请求

emacs - Clojure 和 emacs 的 autodoc

java - Clojure Swing 异常 "No implementation of method: :children"