Clojure 替换贴图内部的向量
我有一个像这样的地图向量Clojure 替换贴图内部的向量,clojure,Clojure,我有一个像这样的地图向量 [{:key1 val1 :key2 val2 :key3 [vector]} {:key1 val1 :key2 val2 :key3 [vector]}] 换句话说,n个映射的向量,其中一个键也是向量 我想用一个新的向量替换:key3向量,在外向量的所有n个映射中,但是我想不出一个好的方法 作为一个额外的问题,我还想创建一个具有相同结构的新地图,但其内部向量包含选定的元素范围。比如从这个 [{:key1 val1 :key2 val2 :key3 [v1 v2
[{:key1 val1 :key2 val2 :key3 [vector]}
{:key1 val1 :key2 val2 :key3 [vector]}]
换句话说,n个映射的向量,其中一个键也是向量
我想用一个新的向量替换:key3向量,在外向量的所有n个映射中,但是我想不出一个好的方法
作为一个额外的问题,我还想创建一个具有相同结构的新地图,但其内部向量包含选定的元素范围。比如从这个
[{:key1 val1 :key2 val2 :key3 [v1 v2 v3 v4]}
{:key1 val2 :key2 val2 :key3 [v1 v2 v3 v4]}]
为此:
[{:key1 val1 :key2 val2 :key3 [v2 v3]}
{:key1 val2 :key2 val2 :key3 [v2 v3]}]
换句话说,从内部向量中选择一系列元素,同时保持数据结构的完整性。您可以使用
mapv
映射向量的元素,使用更新:键3
使用更新In
然后对向量执行另一个mapv
,以提取所需的索引:
(def m [{:key1 val1 :key2 val2 :key3 [:a :b :c :d]}
{:key1 val1 :key2 val2 :key3 [:a :b :c :d]}])
(mapv #(update-in % [:key3] (fn [v] (mapv v [1 2]))) m)
对于许多数据操作,诸如
中的更新和mapv之类的核心函数可以很好地解决此类问题。有几种方法可以巧妙地错误地使用它们,并返回序列而不是向量。代码有时也会变得有点笨拙
创建该库是为了使此类数据操作简单直观:
hello.core> (require '[com.rpl.specter :refer :all])
nil
hello.core> (def data '[{:key1 val1 :key2 val2 :key3 [vector]}
{:key1 val1 :key2 val2 :key3 [vector]}])
#'hello.core/data
hello.core> (setval [ALL :key3] '[v2 v3] data)
[{:key1 val1, :key2 val2, :key3 [v2 v3]}
{:key1 val1, :key2 val2, :key3 [v2 v3]}]
它还尝试对每个转换使用最有效的更新方法。
这提供了一个更完整的(和自以为是的)介绍
hello.core> (require '[com.rpl.specter :refer :all])
nil
hello.core> (def data '[{:key1 val1 :key2 val2 :key3 [vector]}
{:key1 val1 :key2 val2 :key3 [vector]}])
#'hello.core/data
hello.core> (setval [ALL :key3] '[v2 v3] data)
[{:key1 val1, :key2 val2, :key3 [v2 v3]}
{:key1 val1, :key2 val2, :key3 [v2 v3]}]