2017-03-17 73 views
1

的內部向量我有圖的載體,其看起來像這樣替換地圖

[{:key1 val1 :key2 val2 :key3 [vector]} 
{:key1 val1 :key2 val2 :key3 [vector]}] 

換句話說,正的地圖的矢量,與所述鍵中的一個也正在的載體。

我想用外部矢量的所有n個地圖中的新矢量替換:key3矢量,但是我找不到一個好的方法來完成此操作。

作爲一個額外的問題,我也想創建一個具有相同結構的新地圖,但內部向量包含所選元素範圍。因此,例如,從該

[{: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]}] 

換言之從內部向量挑選出一個範圍內的元素,同時保持數據結構否則完好無損。

回答

-1
(def m [{:key1 val1 :key2 val2 :key3 [:a :b :c :d]} 
     {:key1 val1 :key2 val2 :key3 [:a :b :c :d]}]) 

(mapv #(update % :key3 (fn [v] (mapv v [1 2]))) m) 
0

您可以使用mapv映射在向量的元素,使用update-in然後再做另一mapv的載體來提取想要索引更新:key3

(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) 
0

對於許多數據操作,像update-in和mapv這樣的核心功能在這類問題上做得很好。有幾種方法可以巧妙地使用它們,取回一個序列而不是一個向量。有時候,代碼也可能不太現實。

spectre庫的建立是爲了使這種數據處理方便,intuative的:

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

它還會嘗試使用最有效的更新方法每個轉化。 這article給出了一個更完整(和斟酌)的介紹。