更新向量内的映射的 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/