在向量中更新地图的Clojure方法是什么?例如,如果我有这样的事情,假设每个地图都有唯一的 :name
(def some-vec
[{:name "foo"
....}
{:name "bar"
....}
{:name "baz"
....}])
如果地图:name
等于,我想以某种方式更新地图foo
。目前我正在使用map
,像这样
(map (fn [{:keys [name] :as value}]
(if-not (= name "foo")
value
(do-something .....))) some-vec)
但这将遍历整个向量,即使我仅更新一项。
将数据保留为地图,而不是以键为键的地图记录向量: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"}}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句