Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 替换贴图内部的向量_Clojure - Fatal编程技术网

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]}]